home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Developer Essentials / DTS Sample Code / DTS Japan-Sample Code / AppleEvent•MacApp3.0b1•7.0 / UTaro.cp < prev    next >
Encoding:
Text File  |  1992-02-05  |  72.5 KB  |  2,536 lines  |  [TEXT/MPS ]

  1. // Copyright © 1991 Apple Computer, Inc. All rights reserved.
  2.  
  3. #ifndef    __UTARO__
  4. #include "UTaro.h"
  5. #endif
  6.  
  7. #ifndef    __FILES__
  8. #include    <Files.h>
  9. #endif
  10.  
  11. #ifndef    __SOUND__
  12. #include    <Sound.h>
  13. #endif
  14.  
  15. #ifndef    __APPLEEVENTS__
  16. #include    <AppleEvents.h>
  17. #endif
  18.  
  19. #ifndef    __PPCTOOLBOX__
  20. #include    <PPCToolbox.h>
  21. #endif
  22.  
  23. #ifndef    __STRING__
  24. #include    <String.h>
  25. #endif
  26.  
  27. #ifndef    __PROCESSES__
  28. #include    <Processes.h>
  29. #endif
  30.  
  31. #ifndef    __STANDARDFILE__
  32. #include    <StandardFile.h>
  33. #endif
  34.  
  35. #ifndef    __FOLDERS__
  36. #include    <Folders.h>
  37. #endif
  38.  
  39. #ifndef    __ERRORS__
  40. #include    <Errors.h>
  41. #endif
  42.  
  43. #ifndef    __PACKAGES__
  44. #include    <Packages.h>
  45. #endif
  46.  
  47. #ifndef    __MENUS__
  48. #include    <Menus.h>
  49. #endif
  50.  
  51. extern TTaroApplication * gTaroApplication;
  52. Boolean gColorAvailable;
  53.  
  54. const short            kWindRsrcID            =    1000;
  55. const short            kBlackCursor        =    1000;
  56. const    short            kWhiteCursor        =    1001;
  57. const    short            kNotAvailable        =    1002;
  58. const short            kBlackCTable        =    1000;
  59. const    short            kWhiteCTable        =    1001;
  60. const    short            kEmptyCTable        =    1002;
  61. const    short            kGameOverDraw        =    2000;
  62. const    short            kFilename            =    2001;
  63.  
  64. const    short            kSubstitutionKey    =    2002;
  65.  
  66. const    OSType        kPreference        =    'Pref';
  67.  
  68. const    ResType        kLocalResource        =    rAliasType;
  69. const    ResType        kRemoteResource    =    'REMT';
  70.  
  71. const    CommandNumber    cNewPreference    =    cNewServer + 1;
  72. const    CommandNumber    cOpenPreference    =    cOpen + 1;
  73.  
  74. const    CommandNumber    cAddRemote        =    1000;
  75. const    CommandNumber    cRemoveRemote    =    1001;
  76. const    CommandNumber    cAddLocal        =    1002;
  77. const    CommandNumber    cRemoveLocal    =    1003;
  78.  
  79. const    CommandNumber    cSound            =    2000;
  80.  
  81. // ============================== AppleEvent Handler=================================
  82. pascal OSErr    ReceiveApplicationDied(AppleEvent & theAppleEvent, AppleEvent & /*reply*/,
  83.                                 long /*handlerRefcon*/)
  84. {
  85.     DescType    typeCode;
  86.     Size        actualSize;
  87.     long        Error;
  88.     ProcessSerialNumber    thePSN;
  89.     
  90.     FailOSErr(AEGetParamPtr(theAppleEvent, keyErrorNumber, typeLongInteger,
  91.                 typeCode, (Ptr)&Error, sizeof(Error), actualSize));
  92.     FailOSErr(AEGetParamPtr(theAppleEvent, keyProcessSerialNumber, typeProcessSerialNumber,
  93.                 typeCode, (Ptr)&thePSN, sizeof(thePSN), actualSize));
  94.     gTaroApplication->ReturnPreference()->ProcessDied((OSErr)Error, thePSN);
  95.     
  96.     return noErr;
  97. }
  98.  
  99. // ------------------------------------------------------------------------
  100. pascal OSErr    ReceiveReply(AppleEvent & theAppleEvent, AppleEvent & /*reply*/,
  101.                                 long /*handlerRefcon*/)
  102. {
  103.     DescType    typeCode;
  104.     Size        actualSize;
  105.     unsigned long    aTargetTransactionID;
  106.     AEDesc    objSpec;
  107.     
  108.     TAppleEvent * aMessage = new TAppleEvent;
  109.     aMessage->InitializeFromMessage(theAppleEvent, TRUE);
  110.     TClientAEPlayer * MyClientAEPlayer = (TClientAEPlayer *)aMessage->GetTransactionID();
  111.     if(IsObject(MyClientAEPlayer))
  112.         if(IsMemberClassID(MyClientAEPlayer, GetClassIDFromName("TClientAEPlayer")))
  113.         {
  114.             long    returnID = aMessage->GetReturnID();
  115.             switch(returnID)
  116.             {
  117.             case    kNewElementReturnID:
  118.                 aMessage->ReadParameter(keyDirectObject, typeObjectSpecifier, objSpec);
  119.                 MyClientAEPlayer->SetTargetTableSpecifier(objSpec);
  120.                 break;
  121.             case    kBeginTransactionReturnID:
  122.                 aMessage->ReadParameterPtr(keyAETheTransID, typeLongInteger, typeCode, (Ptr)&aTargetTransactionID, sizeof(aTargetTransactionID), actualSize);
  123.                 MyClientAEPlayer->TargetReply(aTargetTransactionID);
  124.                 break;
  125.             default:
  126.                 break;
  127.             }
  128.         }
  129.     
  130.     return noErr;
  131. }
  132.  
  133. // ------------------------------------------------------------------------
  134. pascal Boolean    TaroApplicationFilter(LocationNameRec * /*theLocationNameRec*/, PortInfoRec * thePortInfoRec)
  135. {
  136.     Str255    AppName;
  137.     const    short    kApplicationNameID    =    255;
  138.     long    offset, length;
  139.     Handle    itlHandle;
  140.     
  141.     for(short index = 1; ;index++)
  142.     {
  143.         GetIndString(AppName, kApplicationNameID, index);
  144.         if(*AppName == 0)
  145.             return FALSE;
  146.         IUGetItlTable(iuSystemScript, iuWordSelectTable, itlHandle, offset, length);
  147.         if(!IUEqualPString((char *)AppName, (char *)thePortInfoRec->name.name, itlHandle))
  148.             return TRUE;
  149.     }
  150. }
  151.  
  152. OSErr    TaroPPCBrowser(LocationNameRec & theLocationNameRec, PortInfoRec & thePortInfoRec)
  153. {
  154.     Str255    prompt, applListLabel;
  155.     Boolean    defaultSpecified;
  156.     Str32    theLocNBPType = "";
  157.     const    short        kPPCBrowserPrompt    =    2005;
  158.     const    short        kPrompt                =    1;
  159.     const    short        kLabel                =    2;
  160.     
  161.     GetIndString(prompt, kPPCBrowserPrompt, kPrompt);
  162.     GetIndString(applListLabel, kPPCBrowserPrompt, kLabel);
  163.     defaultSpecified = false;
  164.     
  165.     return PPCBrowser((char *)prompt, (char *)applListLabel, defaultSpecified, theLocationNameRec,
  166.                         thePortInfoRec, TaroApplicationFilter, theLocNBPType);
  167. }
  168.  
  169. // ============================== TTaroApplication =================================
  170. #pragma segment AInit
  171. pascal void TTaroApplication::ITaroApplication(void)
  172. {
  173.     inherited::ITaroApplication();
  174.  
  175.     gColorAvailable = FALSE;
  176.     
  177.     fClientHCellSize = 3;
  178.     fClientVCellSize = 3;
  179.     fClientBlackPlayer = 1;
  180.     fClientWhitePlayer = 1;
  181.  
  182.     FailNILResource((Handle)(fGameDrawMessage = GetString(kGameOverDraw)));
  183.     
  184.     FailNILResource(fBlackCursor = (Handle)GetCursor(kBlackCursor));
  185.     FailNILResource(fWhiteCursor = (Handle)GetCursor(kWhiteCursor));
  186.     FailNILResource(fNotAvailableCursor = (Handle)GetCursor(kNotAvailable));
  187.     
  188.     FailNILResource(fDiveSound = (Handle)GetResource('snd ', kDive));
  189.     FailNILResource(fBangSound = (Handle)GetResource('snd ', kBang));
  190.     FailNILResource(fPshooSound = (Handle)GetResource('snd ', kPshoo));
  191.     FailNILResource(fWarnSound = (Handle)GetResource('snd ', kWarn));
  192.     fSoundEnable = TRUE;
  193.     
  194.     fBlackDrawingEnvironment = new TColorDrawingEnvironment;
  195.     fBlackDrawingEnvironment->IColorDrawingEnvironment(kBlackCTable);
  196.     fWhiteDrawingEnvironment = new TColorDrawingEnvironment;
  197.     fWhiteDrawingEnvironment->IColorDrawingEnvironment(kWhiteCTable);
  198.     fEmptyDrawingEnvironment = new TColorDrawingEnvironment;
  199.     fEmptyDrawingEnvironment->IColorDrawingEnvironment(kEmptyCTable);
  200.  
  201.     fTaroEraser = new TTaroEraser;
  202.     fTaroEraser->IEraseAdorner();
  203.  
  204.     if (gDeadStripSuppression) {
  205.         TTaroWindow *aTaroWindow = new TTaroWindow;
  206.         TTaroGridView *aTaroView = new TTaroGridView;
  207.         TAboutGridView *anAboutGridView = new TAboutGridView;
  208.         TInfoView *anInfoView = new TInfoView;
  209.         TShadowView *aPlayerView = new TShadowView;
  210.         TNumberStringView *aNumberText = new TNumberStringView;
  211.         TStringView *aStringView = new TStringView;
  212.         TStaticText *aStaticText = new TStaticText;
  213.         TTaroStaticText *aTaroStaticText = new TTaroStaticText;
  214.         TPopup *aPopup = new TPopup;
  215.         TPlayerPopup *aPlayerPopup = new TPlayerPopup;
  216.         TTargetListView *aPlayerListView = new TTargetListView;
  217.     }
  218.     
  219.     FailOSErr(AEInstallEventHandler(kCoreEventClass, kAEApplicationDied,
  220.                                             (EventHandlerProcPtr)ReceiveApplicationDied, 0, FALSE));
  221.  
  222.     FailOSErr(AEInstallEventHandler(kCoreEventClass, kAEAnswer,
  223.                                             (EventHandlerProcPtr)ReceiveReply, 0, FALSE));
  224.  
  225.     FailOSErr(AESetInteractionAllowed(kAEInteractWithAll));
  226.     
  227.     TPreferenceFile * aFile = new TPreferenceFile;
  228.     aFile->IPreferenceFile();
  229.  
  230.     HParamBlockRec pb;
  231.     
  232.     if(aFile->GetFileInfo(pb) == fnfErr)
  233.     {
  234.         OpenNew(cNewPreference);
  235.         aFile->Free();
  236.     }
  237.     else
  238.         OpenOld(cOpenPreference, aFile);
  239. }
  240.  
  241. // ------------------------------------------------------------------------
  242. #pragma segment ADoCommand
  243. pascal TColorDrawingEnvironment * TTaroApplication::GetDrawingEnvironment(CellState aColor)
  244. {
  245.     switch(aColor)
  246.     {
  247.     case    kBlack:
  248.         return fBlackDrawingEnvironment;
  249.     case    kWhite:
  250.         return fWhiteDrawingEnvironment;
  251.     default:
  252.         return fEmptyDrawingEnvironment;
  253.     }
  254. }
  255.  
  256. // ------------------------------------------------------------------------
  257. #pragma segment AOpen
  258. pascal Boolean TTaroApplication::NewDocumentDialog(char    & aHSize, char & aVSize,
  259.                                 char & aBlackPlayer, char & aWhitePlayer, Str255 aClientName)
  260. {
  261.     const short        kModalID            =    1001;
  262.     const IDType    kDialogView        =    'DLVW';
  263.     const IDType    kDialogWindow    =    'WIND';
  264.     const IDType    kBlackPopup        =    'BLCK';
  265.     const IDType    kWhitePopup        =    'WHIT';
  266.     const IDType    kHSizePopup        =    'HSIZ';
  267.     const IDType    kVSizePopup        =    'VSIZ';
  268.     const IDType    kNewGame            =    'GAME';
  269.     const IDType    kCancel            =    'CNCL';
  270.     
  271.     char    theHSize, theVSize, theBlackPlayer, theWhitePlayer;
  272.     
  273.     TWindow * aWindow = gViewServer->NewTemplateWindow(kModalID, NULL);
  274.     TPopup * aHSizePopup = (TPopup *)aWindow->FindSubView(kHSizePopup);
  275.     aHSizePopup->SetCurrentItem((short)aHSize, FALSE);
  276.     TPopup * aVSizePopup = (TPopup *)aWindow->FindSubView(kVSizePopup);
  277.     aVSizePopup->SetCurrentItem((short)aVSize, FALSE);
  278.     TPlayerPopup * aBlackPopup = (TPlayerPopup *)aWindow->FindSubView(kBlackPopup);
  279.     TPlayerPopup * aWhitePopup = (TPlayerPopup *)aWindow->FindSubView(kWhitePopup);
  280.  
  281.     if((aBlackPlayer == kServerAEPlayer) || (aWhitePlayer == kServerAEPlayer))
  282.     {
  283.         aHSizePopup->ViewEnable(FALSE, FALSE);
  284.         aVSizePopup->ViewEnable(FALSE, FALSE);
  285.     }
  286.     if(aBlackPlayer == kServerAEPlayer)
  287.         aBlackPopup->SetClientName(aClientName);
  288.     else
  289.         aBlackPopup->SetCurrentItem((short)aBlackPlayer, FALSE);
  290.     
  291.     if(aWhitePlayer == kServerAEPlayer)
  292.         aWhitePopup->SetClientName(aClientName);
  293.     else
  294.         aWhitePopup->SetCurrentItem((short)aWhitePlayer, FALSE);
  295.     
  296.     IDType Dismisser = aWindow->PoseModally();
  297.     theHSize = (char)aHSizePopup->GetCurrentItem();
  298.     theVSize = (char)aVSizePopup->GetCurrentItem();
  299.     theBlackPlayer = (char)aBlackPopup->GetCurrentItem();
  300.     theWhitePlayer = (char)aWhitePopup->GetCurrentItem();
  301.     aWindow->Close();
  302.     if(Dismisser == kNewGame)
  303.     {
  304.         aHSize = theHSize;
  305.         aVSize = theVSize;
  306.         aBlackPlayer = theBlackPlayer;
  307.         aWhitePlayer = theWhitePlayer;
  308.         return TRUE;
  309.     }
  310.     else
  311.         return FALSE;
  312. }
  313.  
  314. // ------------------------------------------------------------------------
  315. #pragma segment AOpen
  316. pascal CommandNumber TTaroApplication::KindOfDocument(CommandNumber itsCommandNumber, TFile* aFile)
  317. {
  318.     CommandNumber aCommandNumber = itsCommandNumber;
  319.     
  320.     switch(itsCommandNumber)
  321.     {
  322.     case    cFinderOpen:
  323.     case    cOpen:
  324.         if(IsObject(aFile))
  325.         {
  326.             OSType    aFileType;
  327.             
  328.             FailOSErr(aFile->GetFileType(aFileType));
  329.             if(aFileType == kPreference)
  330.                 aCommandNumber = cOpenPreference;
  331.         }
  332.         break;
  333.     case    cNewPreference:
  334.     case    cOpenPreference:
  335.         aCommandNumber = cOpenPreference;
  336.         break;
  337.     case    cFinderNew:
  338.         aCommandNumber = cNewClient;
  339.         break;
  340.     default:
  341.         break;
  342.     }
  343.     return aCommandNumber;
  344. }
  345.  
  346.  
  347. // ------------------------------------------------------------------------
  348. #pragma segment AOpen
  349. pascal TFile* TTaroApplication::DoMakeFile(CommandNumber itsCommandNumber)
  350. {
  351.     if(itsCommandNumber == cNewPreference)
  352.     {
  353.         TPreferenceFile    *    aFile = new TPreferenceFile;
  354.         aFile->IPreferenceFile();
  355.         return    aFile;
  356.     }
  357.     else
  358.         return inherited::DoMakeFile(itsCommandNumber);
  359. }
  360.  
  361. // ------------------------------------------------------------------------
  362. #pragma segment AOpen
  363. pascal TDocument *TTaroApplication::DoMakeDocument(CommandNumber itsCommandNumber, TFile* itsFile)
  364. {
  365.     char    aHCellSize, aVCellSize, aColor;
  366.     Str255    aName;
  367.     TDocument    *    newDocument = NULL;
  368.     TAppleEventPlayer    *    aServerPlayer = NULL;
  369.     VOLATILE(newDocument);
  370.     FailInfo    fi;
  371.         
  372.     switch(itsCommandNumber)
  373.     {
  374.     case    cNewClient:
  375.     case    cFinderNew:
  376.         newDocument = new TVisibleDocument;
  377.  
  378.         if (fi.Try())
  379.         {
  380.             ((TVisibleDocument *)newDocument)->IVisibleDocument(TranslateCellSize(fClientHCellSize), TranslateCellSize(fClientVCellSize), 
  381.                                                                 fClientBlackPlayer, fClientWhitePlayer);
  382.             fi.Success();
  383.         }
  384.         else
  385.         {
  386.             FreeIfObject(newDocument);
  387.             fi.ReSignal();
  388.         }
  389.         break;
  390.     case    cNewServer:
  391.         newDocument = new TServerDocument;
  392.         if (fi.Try())
  393.         {
  394.             (gTaroApplication->GetNewElementCommand())->GetServerParameter(aHCellSize, aVCellSize, aColor, aServerPlayer);
  395.             ((TServerDocument *)newDocument)->IServerDocument(TranslateCellSize(aHCellSize), TranslateCellSize(aVCellSize),
  396.                                                     fServerPlayer, (CellState)aColor, aServerPlayer);
  397.             fi.Success();
  398.         }
  399.         else
  400.         {
  401.             newDocument->Free();
  402.             fi.ReSignal();
  403.         }
  404.         break;
  405.     case    cNewPreference:
  406.     case    cOpenPreference:
  407.         newDocument = new TPreferenceDocument;
  408.         if (fi.Try())
  409.         {
  410.             ((TPreferenceDocument *)newDocument)->IPreferenceDocument(itsFile);
  411.             fPreferenceDocument = (TPreferenceDocument *)newDocument;
  412.             fi.Success();
  413.         }
  414.         else
  415.         {
  416.             newDocument->Free();
  417.             fi.ReSignal();
  418.         }
  419.     }
  420.     return newDocument;
  421. }
  422.  
  423. // ------------------------------------------------------------------------
  424. #pragma segment AOpen
  425. pascal void TTaroApplication::OpenNew(CommandNumber itsCommandNumber)
  426. {
  427.     char    aHCellSize, aVCellSize, aBlackPlayer, aWhitePlayer;
  428.     TAppleEventPlayer    *    aServerPlayer;
  429.     Str255    aName;
  430.  
  431.     switch(itsCommandNumber)
  432.     {
  433.     case    cNewClient:
  434.         aHCellSize = fClientHCellSize;
  435.         aVCellSize = fClientVCellSize;
  436.         aBlackPlayer = fClientBlackPlayer;
  437.         aWhitePlayer = fClientWhitePlayer;
  438.         if(NewDocumentDialog(aHCellSize, aVCellSize, aBlackPlayer, aWhitePlayer, NULL))
  439.         {
  440.             fClientHCellSize = aHCellSize;
  441.             fClientVCellSize = aVCellSize;
  442.             fClientBlackPlayer = aBlackPlayer;
  443.             fClientWhitePlayer = aWhitePlayer;
  444.             inherited::OpenNew(itsCommandNumber);
  445.         }
  446.         break;
  447.     case    cNewServer:
  448.         char    aServerColor;
  449.     
  450.         GetNewElementCommand()->GetServerParameter(aHCellSize, aVCellSize, aServerColor, aServerPlayer);
  451.         if(aServerColor == kBlack)
  452.         {
  453.             aBlackPlayer = kMousePlayer;
  454.             aWhitePlayer = kServerAEPlayer;
  455.         }
  456.         else
  457.         {
  458.             aBlackPlayer = kServerAEPlayer;
  459.             aWhitePlayer = kMousePlayer;
  460.         }
  461. //        FailOSErr(AEInteractWithUser(kAEDefaultTimeout, NULL, NULL));
  462.         aServerPlayer->GetName(aName);
  463.         TSoundCommand * aSoundCommand = new TSoundCommand;
  464.         aSoundCommand->ISoundCommand(kDive);
  465.         PostCommand(aSoundCommand);
  466.         if(NewDocumentDialog(aHCellSize, aVCellSize, aBlackPlayer, aWhitePlayer, aName))
  467.         {
  468.             fServerPlayer = (aServerColor == kBlack ? aBlackPlayer : aWhitePlayer);
  469.             inherited::OpenNew(itsCommandNumber);
  470.         }
  471.         break;
  472.     default:
  473.         inherited::OpenNew(itsCommandNumber);
  474.         break;
  475.     }
  476. }
  477.     
  478. // ------------------------------------------------------------------------
  479. #pragma segment AInit
  480. pascal void TTaroApplication::GetFileTypeList(CommandNumber itsCommandNumber, TypeListHandle& typeList)
  481. {
  482.     inherited::GetFileTypeList(itsCommandNumber, typeList);
  483.     switch(itsCommandNumber)
  484.     {
  485.     case    cFinderOpen:
  486.     case    cOpen:
  487.         if(IsHandle((Handle)typeList))
  488.         {
  489.             SetHandleSize((Handle)typeList, GetHandleSize((Handle)typeList) + 4);
  490.             (*typeList)[1] = kPreference;
  491.         }
  492.         else
  493.         {
  494.             typeList = (TypeListHandle)NewHandle(4);
  495.             FailNIL(typeList);
  496.             (*typeList)[0] = kPreference;
  497.         }
  498.         break;
  499.     case    cOpenPreference:
  500.         if(!IsHandle((Handle)typeList))
  501.         {
  502.             typeList = (TypeListHandle)NewHandle(4);
  503.             FailNIL(typeList);
  504.         }
  505.         (*typeList)[0] = kPreference;
  506.         break;
  507.     default:
  508.         break;
  509.     }
  510. }
  511.  
  512. // ------------------------------------------------------------------------
  513. #pragma segment ADoCommand
  514. pascal Handle TTaroApplication::GetColorCursor(short aCursor)
  515. {
  516.     switch(aCursor)
  517.     {
  518.     case    kBlackCursor:
  519.         return fBlackCursor;
  520.     case    kWhiteCursor:
  521.         return fWhiteCursor;
  522.     case    kNotAvailable:
  523.         return fNotAvailableCursor;
  524.     }
  525. }
  526.  
  527. // ------------------------------------------------------------------------
  528. #pragma segment ADoCommand
  529. pascal void TTaroApplication::PutColorCursor(short aCursor, Handle theCursor)
  530. {
  531.     switch(aCursor)
  532.     {
  533.     case    kBlackCursor:
  534.         fBlackCursor = theCursor;
  535.         break;
  536.     case    kWhiteCursor:
  537.         fWhiteCursor = theCursor;
  538.         break;
  539.     case    kNotAvailable:
  540.         fNotAvailableCursor = theCursor;
  541.         break;
  542.     }
  543. }
  544.  
  545. // ------------------------------------------------------------------------
  546. #pragma segment ADoCommand
  547. pascal void TTaroApplication::SetColorCursor(short aCursor)
  548. {
  549.     SetCursor(**((CursHandle)GetColorCursor(aCursor)));
  550. }
  551.  
  552. // ------------------------------------------------------------------------
  553. #pragma segment ADoCommand
  554. pascal StringHandle TTaroApplication::ReturnGameDrawMessage(void)
  555. {
  556.     return fGameDrawMessage;
  557. }
  558.  
  559. // ------------------------------------------------------------------------
  560. #pragma segment ARes
  561. pascal short TTaroApplication::GetDepth(void)
  562. {
  563.     return 1;
  564. }
  565.  
  566. // ------------------------------------------------------------------------
  567. #pragma segment ARes
  568. pascal TTaroEraser * TTaroApplication::GetTaroEraser(void)
  569. {
  570.     return fTaroEraser;
  571. }
  572.  
  573. // ------------------------------------------------------------------------
  574. #pragma segment ADoCommand
  575. pascal TPreferenceDocument * TTaroApplication::ReturnPreference(void)
  576. {
  577.     return fPreferenceDocument;
  578. }
  579.  
  580. // ------------------------------------------------------------------------
  581. #pragma segment ADoCommand
  582. pascal void TTaroApplication::DoAboutBox(void)
  583. {
  584.     Handle    aFlySound = NULL;
  585.     Boolean    soundFlag = FALSE;
  586.     TWindow * aWindow = gViewServer->NewTemplateWindow(1006, NULL);
  587.     if(fSoundEnable)
  588.     {
  589.         aFlySound = GetResource('snd ', kFly);
  590.         if((ResError() == noErr) && IsHandle(aFlySound))
  591.         {
  592.             soundFlag = TRUE;
  593.             SndPlay(NULL, aFlySound, FALSE);
  594.         }
  595.     }
  596.     aWindow->PoseModally();
  597.     aWindow->Close();
  598.     if(soundFlag)
  599.         ReleaseResource(aFlySound);
  600. }
  601.  
  602. // ------------------------------------------------------------------------
  603. void    DrawFrame(const Rect & aRect, TColorDrawingEnvironment * aDrawingEnvironment)
  604. {
  605.     aDrawingEnvironment->SetupAdornerColor(kTopLeftLine);
  606.     MoveTo(aRect.left, aRect.bottom - 2);
  607.     LineTo(aRect.left, aRect.top);
  608.     LineTo(aRect.right - 2, aRect.top);
  609.  
  610.     aDrawingEnvironment->SetupAdornerColor(kBottomRightLine);
  611.     MoveTo(aRect.right - 1, aRect.top + 1);
  612.     LineTo(aRect.right - 1, aRect.bottom - 1);
  613.     LineTo(aRect.left + 1, aRect.bottom - 1);
  614.  
  615.     aDrawingEnvironment->Setup();
  616. }
  617.  
  618. // ------------------------------------------------------------------------
  619. #pragma segment ARes
  620. pascal void TTaroApplication::DrawCell(TView * aView, Rect & aQDRect)    
  621. {
  622.         TColorDrawingEnvironment * aDrawingEnvironment = (TColorDrawingEnvironment *)aView->GetDrawingEnvironment();
  623.         aDrawingEnvironment->Setup();
  624.         EraseRect(aQDRect);
  625.  
  626.         DrawFrame(aQDRect, aDrawingEnvironment);
  627. }
  628.  
  629. // ------------------------------------------------------------------------
  630. #pragma segment ASelCommand
  631. pascal void TTaroApplication::DoMenuCommand(CommandNumber aCommandNumber)    
  632. {
  633.     switch(aCommandNumber)
  634.     {
  635.     case    cAddRemote:
  636.         fPreferenceDocument->AddRemoteTarget();
  637.         break;
  638.     case    cRemoveRemote:
  639.         fPreferenceDocument->PlayerRemoveDialog(kRemoteAEPlayer);
  640.         break;
  641.     case    cAddLocal:
  642.         fPreferenceDocument->AddLocalTarget();
  643.         break;
  644.     case    cRemoveLocal:
  645.         fPreferenceDocument->PlayerRemoveDialog(kLocalAEPlayer);
  646.         break;
  647.     case    cSound:
  648.         ToggleSoundMenu();
  649.         break;
  650.     default:
  651.         inherited::DoMenuCommand(aCommandNumber);
  652.     }
  653. }
  654.  
  655. // ------------------------------------------------------------------------
  656. #pragma segment ASelCommand
  657. pascal void TTaroApplication::DoSetupMenus(void)    
  658. {
  659.     const    short    kSoundMenuString    =    2006;
  660.     const    short    mSoundMenu            =    4;
  661.  
  662.     Enable(cAddRemote, TRUE);
  663.     if(fPreferenceDocument->GetRemoteTargetListSize() != 0)
  664.         Enable(cRemoveRemote, TRUE);
  665.     Enable(cAddLocal, TRUE);
  666.     if(fPreferenceDocument->GetLocalTargetListSize() != 0)
  667.         Enable(cRemoveLocal, TRUE);
  668.     Enable(cSound, TRUE);
  669.     inherited::DoSetupMenus();
  670. }
  671.  
  672. // ------------------------------------------------------------------------
  673. #pragma segment ASelCommand
  674. pascal void TTaroApplication::ToggleSoundMenu(void)    
  675. {
  676.     const    short    kSoundMenuString    =    2006;
  677.     const    short    mSoundMenu            =    4;
  678.     Str255    aMenuString;
  679.     short        Item;
  680.  
  681.     if(fSoundEnable)
  682.     {
  683.         fSoundEnable = FALSE;
  684.         Item = 2;
  685.     }
  686.     else
  687.     {
  688.         fSoundEnable = TRUE;
  689.         Item = 1;
  690.     }
  691.     MenuHandle    soundMenu = MAGetMenu(mSoundMenu);
  692.     GetIndString(aMenuString, kSoundMenuString, Item);
  693.     SetItem(soundMenu, 1, aMenuString);
  694. }
  695.  
  696. // ------------------------------------------------------------------------
  697. #pragma segment AOpen
  698. pascal TAppleEventPlayer * TTaroApplication::CreateServerPlayer(void)
  699. {
  700.     return    new TServerAEPlayer;
  701. }
  702.  
  703. // ------------------------------------------------------------------------
  704. #pragma segment AOpen
  705. pascal void TTaroApplication::PlaySound(SoundEffect aSound)
  706. {
  707.     if(fSoundEnable)
  708.     {
  709.         Handle    aSoundHandle = NULL;
  710.         switch(aSound)
  711.         {
  712.         case    kDive:
  713.             aSoundHandle = fDiveSound;
  714.             break;
  715.         case    kBang:
  716.             aSoundHandle = fBangSound;
  717.             break;
  718.         case    kPshoo:
  719.             aSoundHandle = fPshooSound;
  720.             break;
  721.         case    kWarn:
  722.             aSoundHandle = fWarnSound;
  723.             break;
  724.         default:
  725.             break;
  726.         }
  727.         if(IsHandle(aSoundHandle))
  728.             FailOSErr(SndPlay(NULL, aSoundHandle, FALSE));
  729.     }
  730. }
  731.  
  732. // ============================== TTargetListView =================================
  733. #pragma segment AOpen
  734. pascal void TTargetListView::SetUp(TList * aTargetList)
  735. {
  736.     fTargetList = aTargetList;
  737.     DelRowFirst(1);
  738.     InsItemLast((short)fTargetList->GetSize());
  739. }
  740.  
  741. // ------------------------------------------------------------------------
  742. #pragma segment AOpen
  743. pascal void TTargetListView::GetItemText(short anItem, Str255 & aString)
  744. {
  745.     ((TClientTarget *)fTargetList->At(anItem))->GetName(aString);
  746. }
  747.  
  748. // ------------------------------------------------------------------------
  749. #pragma segment AOpen
  750. pascal void TTargetListView::SelectItem(short anItem, Boolean extendedSelection, Boolean highlight, Boolean select)
  751. {
  752.     Boolean    RemoveButton;
  753.     
  754.     if(!select)
  755.         RemoveButton = FALSE;
  756.     else
  757.         RemoveButton = (((TClientTarget *)fTargetList->At(anItem))->GetUserCount() == 0);
  758.     (gTaroApplication->ReturnPreference())->SetButtonState(RemoveButton);
  759.     inherited::SelectItem(anItem, extendedSelection, highlight, select);
  760. }
  761.  
  762. // ------------------------------------------------------------------------
  763. #pragma segment ASelCommand
  764. pascal void TTargetListView::DeleteSelectedTarget(void)
  765. {
  766.     short    anItem = FirstSelectedItem();
  767.     if(anItem != 0)
  768.     {
  769.         TClientTarget * SelectedTarget = (TClientTarget *)fTargetList->At(anItem);
  770.         fTargetList->AtDelete(anItem);
  771.         SelectedTarget->Remove();
  772.         SelectedTarget->Free();
  773.     }
  774. }
  775.  
  776. // ------------------------------------------------------------------------
  777. #pragma segment AOpen
  778. pascal void TTargetListView::SelectFirstItem(void)
  779. {
  780.     if((fNumOfRows != 0) && (FirstSelectedItem() == 0))
  781.         SelectItem(1, FALSE, TRUE, TRUE);
  782. }
  783.  
  784. // ------------------------------------------------------------------------
  785. #pragma segment AOpen
  786. pascal TClientTarget * TTargetListView::GetSelectedTarget(void)    
  787. {
  788.     short    anItem = FirstSelectedItem();
  789.     if(anItem != 0)
  790.         return (TClientTarget *)fTargetList->At(anItem);
  791.     else
  792.         return NULL;
  793. }
  794.  
  795.  
  796. // ============================== TColorApplication =================================
  797. #pragma segment AInit
  798. pascal void TColorApplication::ITaroApplication(void)
  799. {
  800.     Handle    theCursor;
  801.  
  802.     inherited::ITaroApplication();
  803.  
  804.     fOldDepth = 1;
  805.  
  806.     FailNILResource(theCursor = (Handle)GetCCursor(kBlackCursor));
  807.     PutColorCursor(kBlackCursor, theCursor);
  808.     FailNILResource(theCursor = (Handle)GetCCursor(kWhiteCursor));
  809.     PutColorCursor(kWhiteCursor, theCursor);
  810.     FailNILResource(theCursor = (Handle)GetCCursor(kNotAvailable));
  811.     PutColorCursor(kNotAvailable, theCursor);
  812. }
  813.  
  814. // ------------------------------------------------------------------------
  815. #pragma segment ADoCommand
  816. pascal void TColorApplication::ChangePixelDepth(short depth)
  817. {
  818.     if(fOldDepth != depth)
  819.     {
  820.         if(depth != 1)
  821.         {
  822.             GetDrawingEnvironment(kBlack)->MakePixPatTable();
  823.             GetDrawingEnvironment(kWhite)->MakePixPatTable();
  824.             GetDrawingEnvironment(kEmpty)->MakePixPatTable();
  825.         }
  826.         fOldDepth = depth;
  827.         if(gConfiguration.hasColorQD && (fOldDepth != 1))
  828.             gColorAvailable = TRUE;
  829.         else
  830.             gColorAvailable = FALSE;
  831.     }
  832. }
  833.  
  834. // ------------------------------------------------------------------------
  835. #pragma segment ARes
  836. pascal short TColorApplication::GetDepth(void)
  837. {
  838.     return fOldDepth;
  839. }
  840.  
  841. // ------------------------------------------------------------------------
  842. #pragma segment ADoCommand
  843. pascal void TColorApplication::SetColorCursor(short aCursor)
  844. {
  845.     SetCCursor((CCrsrHandle)GetColorCursor(aCursor));
  846. }
  847.  
  848. // ------------------------------------------------------------------------
  849. #pragma segment ARes
  850. pascal void TColorApplication::DrawCell(TView * aView, Rect & aQDRect)    
  851. {
  852.     if(gColorAvailable)
  853.     {    
  854.         TColorDrawingEnvironment * aDrawingEnvironment = (TColorDrawingEnvironment *)aView->GetDrawingEnvironment();
  855.         aDrawingEnvironment->Setup();
  856.         EraseRect(aQDRect);
  857.  
  858.         DrawFrame(aQDRect, aDrawingEnvironment);
  859.         aQDRect.top++;
  860.         aQDRect.left++;
  861.         aQDRect.bottom--;
  862.         aQDRect.right--;
  863.         DrawFrame(aQDRect, aDrawingEnvironment);
  864.     }
  865.     else
  866.         inherited::DrawCell(aView, aQDRect);
  867. }
  868.  
  869. // ============================== TPreferenceDocument =================================
  870. #pragma segment AOpen
  871. pascal void TPreferenceDocument::IPreferenceDocument(TFile * itsFile)
  872. {
  873.     TList    *    aList;
  874.     
  875.     IFileBasedDocument(itsFile, kPreference);
  876.     fSavePrintInfo = false;
  877.     
  878.     FailNIL(aList = NewList());
  879.     fRemoteTargetList = aList;
  880.     fRemoteTargetList->SetEltType("TPPCTarget");
  881.     
  882.     FailNIL(aList = NewList());
  883.     fLocalTargetList = aList;
  884.     fLocalTargetList->SetEltType("TPSNTarget");
  885.     
  886.     fIdleFreq =2;
  887. }
  888.  
  889. // ------------------------------------------------------------------------
  890. #pragma segment ASelCommand
  891. pascal void TPreferenceDocument::PlayerRemoveDialog(Player ID)
  892. {
  893.     const short        kListDialogID    =    1005;
  894.     const IDType    kDialogView        =    'LSDL';
  895.     const IDType    kDialogWindow    =    'LSTW';
  896.     const IDType    kPrompt            =    'MSSG';
  897.     const IDType    kRemoveTarget    =    'RMVE';
  898.     const IDType    kCancel            =    'CNCL';
  899.     const IDType    kPlayerList        =    'LSVW';
  900.     const    short        kPromptString    =    2003;
  901.     
  902.     Str255    Prompt;
  903.     IDType Dismisser;
  904.     
  905.     TWindow * aWindow = gViewServer->NewTemplateWindow(kListDialogID, NULL);
  906.     TTargetListView * aPlayerListView = (TTargetListView *)aWindow->FindSubView(kPlayerList);
  907.     TStaticText * aStaticText = (TStaticText *)aWindow->FindSubView(kPrompt);
  908.     fRemoveButton = (TButton *)aWindow->FindSubView(kRemoveTarget);
  909.     GetIndString(Prompt, kPromptString, ID);
  910.     aStaticText->SetText(Prompt, FALSE);
  911.     
  912.     if(ID == kRemoteAEPlayer)
  913.         aPlayerListView->SetUp(fRemoteTargetList);
  914.     else if(ID == kLocalAEPlayer)
  915.         aPlayerListView->SetUp(fLocalTargetList);
  916.  
  917.     aPlayerListView->SelectFirstItem();
  918.     Dismisser = aWindow->PoseModally();
  919.     if(Dismisser == kRemoveTarget)
  920.     {
  921.         short    currentRes = (GetFileHandler()->GetFile())->UseResource();
  922.         aPlayerListView->DeleteSelectedTarget();
  923.         UseResFile(currentRes);
  924.     }
  925.     aWindow->Close();
  926. }
  927.  
  928.  
  929. // ------------------------------------------------------------------------
  930. #pragma segment AOpen
  931. pascal void TPreferenceDocument::SetButtonState(Boolean RemoveButton)
  932. {
  933.     const    short    kRemoveString        =    2004;
  934.     const    short    kRemove                =    1;
  935.     const    short    kInUse                =    2;
  936.     Str255    aString;
  937.     
  938.     if(!RemoveButton)
  939.         GetIndString(aString, kRemoveString, kInUse);
  940.     else
  941.         GetIndString(aString, kRemoveString, kRemove);
  942.     fRemoveButton->SetText(aString, FALSE);
  943.     fRemoveButton->DimState(!RemoveButton, FALSE);
  944.     fRemoveButton->ViewEnable(RemoveButton, TRUE);
  945. }
  946.  
  947. // ------------------------------------------------------------------------
  948. #pragma segment ASelCommand
  949. pascal void TPreferenceDocument::AddRemoteTarget(void)    
  950. {
  951.     TargetIDHdl    toTargetID = (TargetIDHdl)NewHandle(sizeof(TargetID));
  952.     PortInfoRec    thePortInfoRec;
  953.     
  954.     LockHandleHigh((Handle)toTargetID);
  955.     if(TaroPPCBrowser((*toTargetID)->location, thePortInfoRec) == noErr)
  956.     {
  957.         Str255    Name;
  958.         
  959.         (*toTargetID)->name = thePortInfoRec.name;
  960.         HUnlock((Handle)toTargetID);
  961.  
  962.         TPPCTarget * aRemoteTarget = new TPPCTarget;
  963.         FailNIL(aRemoteTarget);
  964.         aRemoteTarget->IPPCTarget(toTargetID);
  965.         aRemoteTarget->GetName(Name);        
  966.         fRemoteTargetList->InsertFirst(aRemoteTarget);
  967.  
  968.         short    currentRes = (GetFileHandler()->GetFile())->UseResource();
  969.         AddResource((Handle)toTargetID, kRemoteResource, Unique1ID(kRemoteResource), Name);
  970.         FailResError();
  971.         UseResFile(currentRes);
  972.     }
  973.     else
  974.     {
  975.         HUnlock((Handle)toTargetID);
  976.         DisposHandle((Handle)toTargetID);
  977.     }
  978. }
  979.  
  980. // ------------------------------------------------------------------------
  981. pascal Boolean LocalTaroFilter(CInfoPBPtr    pb)
  982. {
  983.     if((pb->hFileInfo.ioFlFndrInfo.fdCreator == kServerSignature)
  984.     && (pb->hFileInfo.ioFlFndrInfo.fdType == kApplicationFType))
  985.         return FALSE;
  986.     else
  987.         return TRUE;
  988. }
  989.  
  990. // ------------------------------------------------------------------------
  991. #pragma segment ASelCommand
  992. pascal void TPreferenceDocument::AddLocalTarget(void)    
  993. {
  994.     StandardFileReply    MyReply;
  995.     SFTypeList    aTypeList;
  996.     
  997.     aTypeList[0] = 'APPL';
  998.     
  999.     StandardGetFile((FileFilterProcPtr)LocalTaroFilter, 1, aTypeList, MyReply);
  1000.     
  1001.     if(MyReply.sfGood)
  1002.     {
  1003.         AliasHandle    anAliasHandle;
  1004.         Str255    Name;
  1005.  
  1006.         FailOSErr(NewAlias(NULL, MyReply.sfFile, anAliasHandle));
  1007.  
  1008.         TPSNTarget * aLocalTarget = new TPSNTarget;
  1009.         FailNIL(aLocalTarget);
  1010.         aLocalTarget->IPSNTarget(anAliasHandle);
  1011.         aLocalTarget->GetName(Name);
  1012.         fLocalTargetList->InsertFirst(aLocalTarget);
  1013.  
  1014.         short    currentRes = (GetFileHandler()->GetFile())->UseResource();
  1015.         AddResource((Handle)anAliasHandle, kLocalResource, Unique1ID(kLocalResource), Name);
  1016.         FailResError();
  1017.         UseResFile(currentRes);
  1018.     }
  1019. }
  1020.  
  1021. // ------------------------------------------------------------------------
  1022. #pragma segment AClose
  1023. pascal void TPreferenceDocument::Free(void)
  1024. {
  1025.     (GetFileHandler()->GetFile())->UpdateResource();
  1026.     fRemoteTargetList->FreeList();
  1027.     fLocalTargetList->FreeList();
  1028.     inherited::Free();    
  1029. }
  1030.  
  1031. // ------------------------------------------------------------------------
  1032. #pragma segment AClose
  1033. pascal void TPreferenceDocument::ProcessDied(OSErr /*anError*/, ProcessSerialNumber & theProcess)
  1034. {
  1035.     if(GetLocalTargetListSize() != 0)
  1036.     {
  1037.         CObjectIterator iter(fLocalTargetList);
  1038.  
  1039.         for (TPSNTarget * aTarget = (TPSNTarget *)iter.FirstObject(); iter.More(); aTarget = (TPSNTarget *)iter.NextObject())
  1040.             aTarget->CompareProcess(theProcess);
  1041.     }
  1042. }
  1043.  
  1044. // ------------------------------------------------------------------------
  1045. #pragma segment AOpen
  1046. pascal short TPreferenceDocument::AppendPlayerMenu(MenuHandle theMenu)
  1047. {
  1048.     short        ItemNumber = 0;
  1049.     if(GetRemoteTargetListSize() != 0)
  1050.     {
  1051.         CObjectIterator iter(fRemoteTargetList);
  1052.         AppendMenu(theMenu, "-");
  1053.         ItemNumber++;
  1054.         
  1055.         for (TClientTarget * aTarget = (TClientTarget *)iter.FirstObject(); iter.More(); aTarget = (TClientTarget *)iter.NextObject())
  1056.         {
  1057.             Str255    Name;
  1058.     
  1059.             aTarget->GetName(Name);
  1060.             AppendMenu(theMenu, "Dummy");
  1061.             SetItem(theMenu, CountMItems(theMenu), Name);
  1062.             ItemNumber++;
  1063.         }
  1064.     }
  1065.     if(GetLocalTargetListSize() != 0)
  1066.     {
  1067.         CObjectIterator iter(fLocalTargetList);
  1068.  
  1069.         AppendMenu(theMenu, "-");
  1070.         ItemNumber++;
  1071.         for (TClientTarget * aTarget = (TClientTarget *)iter.FirstObject(); iter.More(); aTarget = (TClientTarget *)iter.NextObject())
  1072.         {
  1073.             Str255    Name;
  1074.     
  1075.             aTarget->GetName(Name);
  1076.             AppendMenu(theMenu, "Dummy");
  1077.             SetItem(theMenu, CountMItems(theMenu), Name);
  1078.             ItemNumber++;
  1079.         }
  1080.     }
  1081.     return ItemNumber;
  1082. }
  1083.  
  1084. // ------------------------------------------------------------------------
  1085. #pragma segment ASelCommand
  1086. pascal short TPreferenceDocument::GetRemoteTargetListSize(void)
  1087. {
  1088.     return (short)fRemoteTargetList->GetSize();
  1089. }
  1090.  
  1091. // ------------------------------------------------------------------------
  1092. #pragma segment ASelCommand
  1093. pascal short TPreferenceDocument::GetLocalTargetListSize(void)
  1094. {
  1095.     return (short)fLocalTargetList->GetSize();
  1096. }
  1097.  
  1098. // ------------------------------------------------------------------------
  1099. #pragma segment AOpen
  1100. pascal TClientTarget * TPreferenceDocument::ReturnIndexedTarget(short index)    // base 1
  1101. {
  1102.     short    RemoteListSize = GetRemoteTargetListSize();
  1103.     if(RemoteListSize != 0)
  1104.         index--;
  1105.     if(index <= RemoteListSize)
  1106.         return (TClientTarget *)fRemoteTargetList->At(index);
  1107.     else
  1108.     {
  1109.         index -= RemoteListSize;
  1110.         short    LocalListSize = GetLocalTargetListSize();
  1111.         if(LocalListSize != 0)
  1112.             index--;
  1113.         if(index <= LocalListSize)
  1114.             return (TClientTarget *)fLocalTargetList->At(index);
  1115.         else
  1116.             return NULL;
  1117.     }
  1118. }
  1119.  
  1120. // ------------------------------------------------------------------------
  1121. #pragma segment AOpen
  1122. pascal void TPreferenceDocument::DoRead(TFile* aFile, Boolean forPrinting)
  1123. {
  1124.     short    Count;
  1125.     short    ResourceNumber;
  1126.  
  1127.     inherited::DoRead(aFile, forPrinting);        
  1128.     short    savedResFile = aFile->UseResource();
  1129.     if((ResourceNumber = Count1Resources(kLocalResource)) != 0)
  1130.     {
  1131.         for(Count = 1; Count <= ResourceNumber; Count ++)
  1132.         {
  1133.             AliasHandle    aFile;
  1134.             FailNILResource((Handle)(aFile = (AliasHandle)Get1IndResource(kLocalResource, Count)));
  1135.             TPSNTarget * aLocalTarget = new TPSNTarget;
  1136.             FailNIL(aLocalTarget);
  1137.             aLocalTarget->IPSNTarget(aFile);
  1138.             fLocalTargetList->InsertLast(aLocalTarget);
  1139.         }
  1140.     }
  1141.     if((ResourceNumber = Count1Resources(kRemoteResource)) != 0)
  1142.     {
  1143.         for(Count = 1; Count <= ResourceNumber; Count ++)
  1144.         {
  1145.             TargetIDHdl    aTargetID;
  1146.             FailNILResource((Handle)(aTargetID = (TargetIDHdl)Get1IndResource(kRemoteResource, Count)));
  1147.             TPPCTarget * aRemoteTarget = new TPPCTarget;
  1148.             FailNIL(aRemoteTarget);
  1149.             aRemoteTarget->IPPCTarget(aTargetID);
  1150.             fRemoteTargetList->InsertLast(aRemoteTarget);
  1151.         }
  1152.     }
  1153.     UseResFile(savedResFile);
  1154. }
  1155.  
  1156. // ------------------------------------------------------------------------
  1157. #pragma segment AOpen
  1158. pascal void TPreferenceDocument::DoInitialState(void)
  1159. {
  1160.     HParamBlockRec    pb;
  1161.     OSErr    anError;
  1162.     TPreferenceFile *    aFile = (TPreferenceFile *)(GetFileHandler()->GetFile());
  1163.     
  1164.     if((anError = aFile->GetFileInfo(pb)) == fnfErr)
  1165.         aFile->CreateFile();
  1166.     else if(anError != noErr)
  1167.         FailOSErr(anError);
  1168.     FailOSErr(aFile->OpenFile());        
  1169. }
  1170.  
  1171. // ------------------------------------------------------------------------
  1172. #pragma segment AOpen
  1173. pascal void TPreferenceDocument::DoMakeViews(Boolean /* forPrinting */)
  1174. {
  1175. }
  1176.  
  1177.  
  1178. // ============================== TPlayerPopup =================================
  1179. #pragma segment AOpen
  1180. pascal void TPlayerPopup::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1181. {
  1182.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  1183.     SetMax((gTaroApplication->ReturnPreference())->AppendPlayerMenu(GetMenuHandle()) + GetMax(), FALSE);
  1184. }
  1185.  
  1186. // ------------------------------------------------------------------------
  1187. #pragma segment AOpen
  1188. pascal void TPlayerPopup::SetClientName(Str255 aClientName)
  1189. {
  1190.     MenuHandle    aMenuHandle = GetMenuHandle();
  1191.     short    MItems = CountMItems(aMenuHandle);
  1192.     while(MItems > 1)
  1193.         DelMenuItem(aMenuHandle, MItems--);
  1194. //    ViewEnable(FALSE, FALSE);
  1195.     SetItem(aMenuHandle, 1, aClientName);
  1196.     SetCurrentItem(1, FALSE);
  1197. }
  1198.  
  1199. // ============================== TPreferenceFile =================================
  1200. #pragma segment AOpen
  1201. pascal void TPreferenceFile::IPreferenceFile(void)
  1202. {
  1203.     short    foundVRefNum;
  1204.     long    foundDirID;
  1205.     StringHandle    Filename;
  1206.     
  1207.     IFile(kPreference, kSignature, FALSE, TRUE, FALSE, TRUE);
  1208.     FailNILResource((Handle)(Filename = GetString(kFilename)));
  1209.  
  1210.     FailOSErr(FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
  1211.                                     foundVRefNum, foundDirID));
  1212.     FailOSErr(SpecifyWithTrio(foundVRefNum, foundDirID, (Str63)(**Filename)));
  1213.     fRsrcPermission = fsRdWrPerm;
  1214. }
  1215.  
  1216.  
  1217. // ============================== TVisibleDocument =================================
  1218. #pragma segment AOpen
  1219. pascal void TVisibleDocument::IVisibleDocument(char aHCellSize, char aVCellSize,
  1220.                                         char aBlackPlayer, char aWhitePlayer)
  1221. {
  1222.     TList * aList = NewList();
  1223.     FailNIL(aList);
  1224.     aList->SetEltType("TRecordCell");
  1225.     fMoveList = aList;
  1226.  
  1227.     fVisibleScene = NULL;
  1228.     
  1229.     ICoreDocument(aHCellSize, aVCellSize, aBlackPlayer, aWhitePlayer);
  1230.     fSavePrintInfo = true;                    // save print record
  1231.     
  1232.     fIdleFreq =2;
  1233. }
  1234.  
  1235. // ------------------------------------------------------------------------
  1236. pascal TPlayer * TVisibleDocument::CreatePlayer(char PlayerType, CellState aColor)
  1237. {
  1238.     TPlayer    *    NewPlayer = NULL;
  1239.     VOLATILE(NewPlayer);
  1240.     FailInfo    fi;
  1241.     
  1242.     if(PlayerType == kMousePlayer)
  1243.     {
  1244.         NewPlayer = new TMousePlayer;
  1245.         if (fi.Try())
  1246.         {
  1247.             ((TMousePlayer *)NewPlayer)->IMousePlayer(this);
  1248.             fi.Success();
  1249.         }
  1250.         else
  1251.         {
  1252.             NewPlayer->GameOver(kClose);
  1253.             FreeIfObject(NewPlayer);
  1254.             fi.ReSignal();
  1255.         }
  1256.     }
  1257.     else
  1258.     {
  1259.         TClientTarget * aClientTarget = (gTaroApplication->ReturnPreference())->ReturnIndexedTarget(PlayerType-1);
  1260.         if(IsObject(aClientTarget))
  1261.         {
  1262.             NewPlayer = new TClientAEPlayer;
  1263.             if (fi.Try())
  1264.             {
  1265.                 ((TClientAEPlayer *)NewPlayer)->IClientAEPlayer(this, aColor, aClientTarget);
  1266.                 fi.Success();
  1267.             }
  1268.             else
  1269.             {
  1270.                 NewPlayer->GameOver(kClose);
  1271.                 FreeIfObject(NewPlayer);
  1272.                 fi.ReSignal();
  1273.             }
  1274.         }
  1275.     }
  1276.     return NewPlayer;
  1277. }
  1278.  
  1279. // ------------------------------------------------------------------------
  1280. #pragma segment AClose
  1281. pascal void TVisibleDocument::Free()
  1282. {
  1283.     FreeIfObject(fVisibleScene);
  1284.     if(IsObject(fMoveList))
  1285.         fMoveList->FreeList();
  1286.     inherited::Free();    
  1287. }
  1288.  
  1289. // ------------------------------------------------------------------------
  1290. #pragma segment ASelCommand
  1291. pascal TInfoView * TVisibleDocument::ReturnInfoView(void)
  1292. {
  1293.     return fInfoView;
  1294. }
  1295.  
  1296. // ------------------------------------------------------------------------
  1297. #pragma segment ASelCommand
  1298. pascal TVisibleScene * TVisibleDocument::ReturnVisibleScene(void)
  1299. {
  1300.     return fVisibleScene;
  1301. }
  1302.  
  1303. // ------------------------------------------------------------------------
  1304. #pragma segment ASelCommand
  1305. pascal void TVisibleDocument::ShowStatusMessage(Str255 & aMessage)
  1306. {
  1307.     fInfoView->ShowStatusMessage(aMessage);
  1308. }
  1309.  
  1310. // ------------------------------------------------------------------------
  1311. #pragma segment AOpen
  1312. pascal void TVisibleDocument::DoMakeViews(Boolean forPrinting)
  1313. {
  1314.     if(IsObject(GetPlayer(kBlackTurn)) && IsObject(GetPlayer(kWhiteTurn)))
  1315.     {
  1316.         Str255    aString;
  1317.     
  1318.         TTaroWindow * aWindow = (TTaroWindow *)gViewServer->NewTemplateWindow(kWindRsrcID, this);
  1319.     
  1320.         TView * aPrintView = aWindow->FindSubView('PRVW');
  1321.         fInfoView = (TInfoView *)aWindow->FindSubView('Info');
  1322.         fInfoView->SetColor(kEmpty);
  1323.         TNumberStringView * aBlackNumber = (TNumberStringView *)aWindow->FindSubView('Num1');
  1324.         aBlackNumber->SetColor(kBlack);
  1325.         TNumberStringView * aWhiteNumber = (TNumberStringView *)aWindow->FindSubView('Num2');
  1326.         aWhiteNumber->SetColor(kWhite);
  1327.         TShadowView * aBlackPlayer = (TShadowView *)aWindow->FindSubView('BLPV');
  1328.         aBlackPlayer->SetColor(kBlack);
  1329.         TShadowView * aWhitePlayer = (TShadowView *)aWindow->FindSubView('WHPV');
  1330.         aWhitePlayer->SetColor(kWhite);
  1331.         TTaroStaticText * aStaticText = (TTaroStaticText *)aWindow->FindSubView('TEXT');
  1332.         aStaticText->SetColor(kEmpty);
  1333.         TStringView * aBlackText = (TStringView *)aWindow->FindSubView('TXBL');
  1334.         TStringView * aWhiteText = (TStringView *)aWindow->FindSubView('TXWH');
  1335.         fInfoView->SetView(aBlackNumber, aWhiteNumber, aStaticText, aBlackText, aWhiteText);
  1336.         TShadowView * aBaseView = (TShadowView *)aWindow->FindSubView('Base');
  1337.         aBaseView->SetColor(kEmpty);
  1338.  
  1339.         GetPlayerName(kBlackTurn, aString);
  1340.         fInfoView->SetPlayer(kBlack, aString);
  1341.         GetPlayerName(kWhiteTurn, aString);
  1342.         fInfoView->SetPlayer(kWhite, aString);
  1343.  
  1344.         fTaroView = (TTaroGridView *)aWindow->FindSubView('Taro');
  1345.         fVisibleScene = new TVisibleScene;
  1346.         FailNIL(fVisibleScene);
  1347.         
  1348.         char    hCellSize, vCellSize;
  1349.         GetCellSize(hCellSize, vCellSize);
  1350.         fTaroView->SetVisibleScene(fVisibleScene, (short)hCellSize, (short)vCellSize);
  1351.         fVisibleScene->IVisibleScene(fTaroView, this);
  1352.         fVisibleScene->SetInitialState();
  1353.     
  1354.         TStdPrintHandler *aStdHandler = new TStdPrintHandler;
  1355.         FailNIL(aStdHandler);
  1356.         aStdHandler->IStdPrintHandler(    this,             // document
  1357.                                                 aPrintView,        // view to be printed 
  1358.                                                 kSquareDots,    // Tall Adjusted - true for bit maps 
  1359.                                                 kFixedSize,     // width of each printed page fixed?
  1360.                                                 kFixedSize);    // height fixed ?
  1361.     }
  1362.     inherited::DoMakeViews(forPrinting);
  1363. }
  1364.  
  1365.  
  1366. // ------------------------------------------------------------------------
  1367. #pragma segment AOpen
  1368. pascal void TVisibleDocument::Save(CommandNumber /*itsCommandNumber*/, Boolean /*askForFileName*/,
  1369.                                                                     Boolean /*makingCopy*/)
  1370. {
  1371.     NotYetImplemented((Str255)"");
  1372. }
  1373.  
  1374. // ------------------------------------------------------------------------
  1375. #pragma segment ARes
  1376. pascal void TVisibleDocument::GetPlayerName(GameState aColor, Str255    & aString)
  1377. {
  1378.     GetPlayer(aColor)->GetName(aString);
  1379. }
  1380.  
  1381. // ------------------------------------------------------------------------
  1382. #pragma segment AClose
  1383. pascal void TVisibleDocument::GameOver(void)
  1384. {
  1385.     GameResult    BlackResult, WhiteResult;
  1386.     
  1387.     inherited::GameOver();
  1388.     short    BlackNumber = ReturnVisibleScene()->GetCount(kBlack);
  1389.     short    WhiteNumber = ReturnVisibleScene()->GetCount(kWhite);
  1390.     if(BlackNumber > WhiteNumber)
  1391.     {
  1392.         BlackResult = kWin;
  1393.         WhiteResult = kLose;
  1394.     }
  1395.     else if(BlackNumber < WhiteNumber)
  1396.     {
  1397.         BlackResult = kLose;
  1398.         WhiteResult = kWin;
  1399.     }
  1400.     else
  1401.     {
  1402.         BlackResult = kDraw;
  1403.         WhiteResult = kDraw;
  1404.         Str255 aMessage((char *)(**(gTaroApplication->ReturnGameDrawMessage())));
  1405.         ShowStatusMessage(aMessage);
  1406.     }
  1407.     GetPlayer(kBlackTurn)->GameOver(BlackResult);
  1408.     GetPlayer(kWhiteTurn)->GameOver(WhiteResult);
  1409. }
  1410.  
  1411. // ------------------------------------------------------------------------
  1412. #pragma segment AClose
  1413. pascal void TVisibleDocument::GameClose(void)
  1414. {
  1415.     TPlayer    *    aPlayer;
  1416.     
  1417.     if(IsObject(aPlayer = GetPlayer(kBlackTurn)))
  1418.         aPlayer->GameOver(kClose);
  1419.     if(IsObject(aPlayer = GetPlayer(kWhiteTurn)))
  1420.         aPlayer->GameOver(kClose);
  1421.     inherited::GameOver();
  1422. }
  1423.  
  1424. // ------------------------------------------------------------------------
  1425. #pragma segment ASelCommand
  1426. pascal void TVisibleDocument::SendTurn(void)
  1427. {
  1428.     if(GetTurn() != kGameOver)
  1429.         fVisibleScene->SetTurn(GetTurnCellState());
  1430.     inherited::SendTurn();
  1431. }
  1432.  
  1433. // ------------------------------------------------------------------------
  1434. #pragma segment ASelCommand
  1435. pascal void TVisibleDocument::MouseMove(TRecordCell * aMouseMove)
  1436. {
  1437.     TPlayer * aPlayer;
  1438.     
  1439.     if(IsObject(aPlayer = GetTemporaryPlayer()))
  1440.         aPlayer->MouseMove(aMouseMove);
  1441. }
  1442.  
  1443. // ------------------------------------------------------------------------
  1444. #pragma segment ASelCommand
  1445. pascal void TVisibleDocument::PlayerMove(TRecordCell * aPlayerMove)
  1446. {
  1447.     TCell * theCell;
  1448.     
  1449.     if(IsObject(aPlayerMove))
  1450.     {
  1451.         fMoveList->InsertLast(aPlayerMove);
  1452.         theCell = ReturnVisibleScene()->GetCell(aPlayerMove->GetColumn(), aPlayerMove->GetRow());
  1453.         theCell->PutPiece();
  1454.         TSoundCommand * aSoundCommand = new TSoundCommand;
  1455.         aSoundCommand->ISoundCommand(kBang);
  1456.         PostCommand(aSoundCommand);
  1457.     }
  1458.     inherited::PlayerMove(aPlayerMove);
  1459. }
  1460.  
  1461.  
  1462. // ============================== TServerDocument =================================
  1463. #pragma segment AOpen
  1464. pascal void TServerDocument::IServerDocument(char aHCellSize, char aVCellSize, char aPlayer,
  1465.                                                     CellState aColor, TAppleEventPlayer * aServerPlayer)
  1466. {
  1467.     char    aBlackPlayer = (aColor == kBlack ? aPlayer : kServerAEPlayer);
  1468.     char    aWhitePlayer = (aColor == kWhite ? aPlayer : kServerAEPlayer);
  1469.     fServerPlayer = aServerPlayer;
  1470.     IVisibleDocument(aHCellSize, aVCellSize, aBlackPlayer, aWhitePlayer);
  1471. }
  1472.  
  1473. // ------------------------------------------------------------------------
  1474. pascal TPlayer * TServerDocument::CreatePlayer(char PlayerType, CellState aColor)
  1475. {
  1476.     TPlayer    *    NewPlayer = NULL;
  1477.     
  1478.     if(PlayerType == kServerAEPlayer)
  1479.     {
  1480.         NewPlayer = fServerPlayer;
  1481.         ((TServerAEPlayer *)NewPlayer)->IServerAEPlayer(this, aColor);
  1482.     }
  1483.     else
  1484.         NewPlayer = inherited::CreatePlayer(PlayerType, aColor);
  1485.     return NewPlayer;
  1486. }
  1487.  
  1488.  
  1489. // ============================== TVisibleScene =================================
  1490. #pragma segment AOpen
  1491. pascal TCell * TVisibleScene::CreateCell(char aColumn, char aRow)
  1492. {
  1493.     TVisibleCell * aVisibleCell = new TVisibleCell;
  1494.     FailNIL(aVisibleCell);
  1495.     AddCellLast(aVisibleCell);
  1496.     aVisibleCell->ICell(this, aColumn, aRow);
  1497.     return aVisibleCell;
  1498. }
  1499.  
  1500. // ------------------------------------------------------------------------
  1501. #pragma segment AOpen
  1502. pascal void TVisibleScene::IVisibleScene(TTaroGridView * aTaroView,
  1503.                                             TVisibleDocument * aCoreDocument)
  1504. {
  1505.     fTaroView = aTaroView;
  1506.     IScene(aCoreDocument);
  1507. }
  1508.  
  1509. // ------------------------------------------------------------------------
  1510. #pragma segment ARes
  1511. pascal void TVisibleScene::ChangeCount(CellState aColor, short aNumber)
  1512. {
  1513.     inherited::ChangeCount(aColor, aNumber);
  1514.     if(aColor == kWhite)
  1515.         (((TVisibleDocument *)ReturnCoreDocument())->ReturnInfoView())->SetNumber(kWhite, GetCount(kWhite));
  1516.     else if(aColor == kBlack)
  1517.         (((TVisibleDocument *)ReturnCoreDocument())->ReturnInfoView())->SetNumber(kBlack, GetCount(kBlack));
  1518. }
  1519.  
  1520. // ------------------------------------------------------------------------
  1521. #pragma segment AOpen
  1522. pascal void TVisibleScene::SetInitialState(void)
  1523. {
  1524.     inherited::SetInitialState();
  1525.     SearchAvailableCell();
  1526. }
  1527.  
  1528.  
  1529. // ------------------------------------------------------------------------
  1530. #pragma segment ARes
  1531. pascal TTaroGridView * TVisibleScene::ReturnTaroGridView(void)
  1532. {
  1533.     return fTaroView;
  1534. }
  1535.  
  1536. // ============================== TVisibleGridView =================================
  1537. #pragma segment AOpen
  1538. pascal void TVisibleGridView::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1539. {
  1540.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  1541.     AddAdorner(gTaroApplication->GetTaroEraser(), kDrawView - 10, FALSE);
  1542.     fDrawingEnvironment = gTaroApplication->GetDrawingEnvironment(kEmpty);
  1543.     fIdleFreq = 2;                                    // so DoSetCursor gets called often
  1544. }
  1545.  
  1546. // ------------------------------------------------------------------------
  1547. #pragma segment ARes
  1548. pascal void TVisibleGridView::Draw(const VRect& area)
  1549. {
  1550.     Focus();
  1551.     if(gConfiguration.hasColorQD && (gTaroApplication->GetDepth() != 1))
  1552.         gColorAvailable = TRUE;
  1553.     else
  1554.         gColorAvailable = FALSE;
  1555.  
  1556.     inherited::Draw(area);
  1557. }
  1558.  
  1559. // ------------------------------------------------------------------------
  1560. #pragma segment ARes
  1561. pascal void TVisibleGridView::DrawCell(GridCell aCell, const VRect&    /* aRect */)    
  1562. {
  1563.     VRect        cellRect;
  1564.     Rect        qdRect;
  1565.     
  1566.     CellState    aState = GetCellState(aCell);
  1567.     CellToVRect(aCell, cellRect);
  1568.     ViewToQDRect(cellRect, qdRect);
  1569.     fDrawingEnvironment = gTaroApplication->GetDrawingEnvironment(aState);
  1570.     gTaroApplication->DrawCell(this, qdRect);
  1571. }
  1572.  
  1573. // ------------------------------------------------------------------------
  1574. #pragma segment ARes
  1575. pascal CellState TVisibleGridView::GetCellState(GridCell /*aCell*/)    
  1576. {
  1577.     SubClassResponsibility();
  1578.     return kEmpty;
  1579. }
  1580.  
  1581. // ============================== TTaroGridView =================================
  1582. #pragma segment ARes
  1583. pascal void TTaroGridView::ForceRedrawCell(TVisibleCell * aVisibleCell)
  1584. {
  1585.     GridCell    aCell((short)(aVisibleCell->GetColumn() + 1), (short)(aVisibleCell->GetRow() + 1));
  1586.     VRect    cellRect;
  1587.     
  1588.     Focus();
  1589.     CellToVRect(aCell, cellRect);
  1590.     InvalidateVRect(cellRect);
  1591. }
  1592.  
  1593. // ------------------------------------------------------------------------
  1594. #pragma segment ARes
  1595. pascal void TTaroGridView::SetEraseColor(TVisibleCell * aVisibleCell)
  1596. {
  1597.     fDrawingEnvironment = gTaroApplication->GetDrawingEnvironment(aVisibleCell->GetState());
  1598. }
  1599.  
  1600. // ------------------------------------------------------------------------
  1601. #pragma segment ARes
  1602. pascal void TTaroGridView::SetVisibleScene(TVisibleScene * aVisibleScene, short hCellSize, short vCellSize)
  1603. {
  1604.     VRect    aFrame;
  1605.     VPoint    size;
  1606.     
  1607.     fVisibleScene = aVisibleScene;
  1608.     GetFrame(aFrame);
  1609.     size = aFrame.Size();
  1610.     DelColFirst((short)fNumOfCols);
  1611.     InsColFirst(hCellSize, (short)(size.h / hCellSize));
  1612.     DelRowFirst((short)fNumOfRows);
  1613.     InsRowFirst(vCellSize, (short)(size.v / vCellSize));
  1614. }
  1615.  
  1616. // ------------------------------------------------------------------------
  1617. #pragma segment ARes
  1618. pascal CellState TTaroGridView::GetCellState(GridCell aCell)    
  1619. {
  1620.     return (fVisibleScene->GetCell(aCell.h - 1, aCell.v - 1))->GetState();
  1621. }
  1622.  
  1623. // ------------------------------------------------------------------------
  1624. #pragma segment ASelCommand
  1625. pascal void TTaroGridView::DoMouseCommand(VPoint& theMouse, TToolboxEvent* /*event*/, Point /*hysteresis*/)
  1626. {
  1627.     GridCell aCell;
  1628.  
  1629.     if (IdentifyPoint(theMouse, aCell) == inCell)
  1630.     {
  1631.         TVisibleCell * aVisibleCell = (TVisibleCell *)(fVisibleScene->GetCell(aCell.h - 1, aCell.v - 1));
  1632.         if(aVisibleCell->IsAvailable())
  1633.         {
  1634.             TRecordCell * aMove = new TRecordCell;
  1635.             FailNIL(aMove);
  1636.             aMove->IRecordCell(aVisibleCell->GetColumn(), aVisibleCell->GetRow(), (aVisibleCell->GetScene())->GetTurn());
  1637.             ((TVisibleDocument *)fDocument)->MouseMove(aMove);
  1638.         }
  1639.         else
  1640.             gTaroApplication->PlaySound(kWarn);
  1641.     }
  1642. }
  1643.  
  1644. // ------------------------------------------------------------------------
  1645. #pragma segment ARes
  1646. pascal void    TTaroGridView::DoSetCursor(const VPoint& localPoint, RgnHandle cursorRegion)
  1647. {
  1648.     VRect    aCellRect;
  1649.     Rect    QDRect;
  1650.     GridCell aCell;
  1651.  
  1652.     if (IdentifyPoint(localPoint, aCell) == inCell)
  1653.     {
  1654.         TVisibleCell * aVisibleCell = (TVisibleCell *)(fVisibleScene->GetCell(aCell.h - 1, aCell.v - 1));
  1655.         SetCursor(aVisibleCell);
  1656.         CellToVRect(aCell, aCellRect);
  1657.         ViewToQDRect(aCellRect, QDRect);
  1658.         RectRgn(cursorRegion, QDRect);
  1659.     }
  1660. }
  1661.  
  1662. // ------------------------------------------------------------------------
  1663. #pragma segment ARes
  1664. pascal void    TTaroGridView::SetCursor(TVisibleCell * aVisibleCell)
  1665. {
  1666.     short    aCursor;
  1667.     
  1668.     if(aVisibleCell->IsAvailable() == TRUE)
  1669.     {
  1670.         CellState    aTurn = (aVisibleCell->GetScene())->GetTurn();
  1671.         if(aTurn == kBlack)
  1672.             aCursor = kBlackCursor;
  1673.         else if(aTurn == kWhite)
  1674.             aCursor = kWhiteCursor;
  1675.     }
  1676.     else
  1677.         aCursor = kNotAvailable;
  1678.     gTaroApplication->SetColorCursor(aCursor);
  1679. }
  1680.  
  1681. // ============================== TAboutGridView =================================
  1682. #pragma segment AOpen
  1683. pascal void TAboutGridView::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1684. {
  1685.     inherited::IRes(itsDocument, itsSuperView, itsParams);
  1686.     for(short v = 0; v < kNumOfRow; v++)
  1687.         for(short h = 0; h < kNumOfColumn; h++)
  1688.             fAboutCell[h][v] = kEmpty;
  1689.     fTaroBitMapHandle = (TaroBitMapHandle)GetResource('HEXA', 128);
  1690. }
  1691.  
  1692. // ------------------------------------------------------------------------
  1693. #pragma segment ARes
  1694. pascal CellState TAboutGridView::GetCellState(GridCell aCell)    
  1695. {
  1696.     return GetBitMapData(aCell) ? kBlack : kWhite;
  1697. //    return fAboutCell[aCell.h - 1][aCell.v - 1];
  1698. }
  1699.  
  1700. // ------------------------------------------------------------------------
  1701. #pragma segment ARes
  1702. pascal void TAboutGridView::SetCellState(GridCell aCell, CellState aState)    
  1703. {
  1704.     fAboutCell[aCell.h - 1][aCell.v - 1] = aState;
  1705.     VRect    cellRect;
  1706.     
  1707.     Focus();
  1708.     CellToVRect(aCell, cellRect);
  1709.     InvalidateVRect(cellRect);
  1710. }
  1711.  
  1712. // ------------------------------------------------------------------------
  1713. #pragma segment ASelCommand
  1714. pascal void TAboutGridView::DoMouseCommand(VPoint& /*theMouse*/, TToolboxEvent* /*event*/, Point /*hysteresis*/)
  1715. {
  1716. }
  1717.  
  1718. // ------------------------------------------------------------------------
  1719. #pragma segment ADoCommand
  1720. pascal Boolean TAboutGridView::GetBitMapData(GridCell aCell)
  1721. {
  1722.     return ((*fTaroBitMapHandle)->bitMapData[aCell.v - 1] >> (kNumOfColumn - aCell.h)) & 1;
  1723. }
  1724.  
  1725. // ------------------------------------------------------------------------
  1726. #pragma segment ADoCommand
  1727. pascal void TAboutGridView::Free(void)
  1728. {
  1729.     ReleaseResource((Handle)fTaroBitMapHandle);
  1730.     inherited::Free();
  1731. }
  1732.  
  1733. // ============================== TTaroWindow =================================
  1734. #pragma segment ARes
  1735. pascal void TTaroWindow::Update(void)
  1736. {
  1737.     if(gConfiguration.hasColorQD)
  1738.         ((TColorApplication *)gTaroApplication)->ChangePixelDepth((*((CGrafPtr)GetGrafPort())->portPixMap)->pixelSize);
  1739.     inherited::Update();
  1740. }
  1741.  
  1742. // ============================== TShadowView =================================
  1743. #pragma segment AOpen
  1744. pascal void TShadowView::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1745. {
  1746.     inherited::IRes(itsDocument, itsSuperView, itsParams);
  1747.     AddAdorner(gTaroApplication->GetTaroEraser(), kDrawView - 10, FALSE);
  1748.     fIdleFreq = 0;                                    // so DoSetCursor gets called often    
  1749. }
  1750.  
  1751. // ------------------------------------------------------------------------
  1752. #pragma segment ARes
  1753. pascal void TShadowView::Draw(const VRect& /*area*/)    
  1754. {
  1755.     Rect    aQDRect;
  1756.     
  1757.     GetQDExtent(aQDRect);
  1758.     gTaroApplication->DrawCell(this, aQDRect);
  1759. }
  1760.  
  1761. // ------------------------------------------------------------------------
  1762. #pragma segment ARes
  1763. pascal void TShadowView::SetColor(CellState aColor)    
  1764. {
  1765.     fColor = aColor;
  1766.     fDrawingEnvironment = gTaroApplication->GetDrawingEnvironment(aColor);
  1767. }
  1768.  
  1769. // ============================== TTaroStaticText =================================
  1770. #pragma segment AOpen
  1771. pascal void TTaroStaticText::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1772. {
  1773.     inherited::IRes(itsDocument, itsSuperView, itsParams);
  1774.     AddAdorner(gTaroApplication->GetTaroEraser(), kDrawView - 10, FALSE);
  1775.     fIdleFreq = 0;                                    // so DoSetCursor gets called often    
  1776. }
  1777.  
  1778. // ------------------------------------------------------------------------
  1779. #pragma segment ARes
  1780. pascal void TTaroStaticText::Draw(const VRect& area)    
  1781. {
  1782.     if(fDrawingEnvironment)
  1783.         ((TColorDrawingEnvironment *)fDrawingEnvironment)->Setup();
  1784.     inherited::Draw(area);
  1785. }
  1786.  
  1787. // ------------------------------------------------------------------------
  1788. #pragma segment ARes
  1789. pascal void TTaroStaticText::SetColor(CellState aColor)    
  1790. {
  1791.     fDrawingEnvironment = gTaroApplication->GetDrawingEnvironment(aColor);
  1792. }
  1793.  
  1794. // ------------------------------------------------------------------------
  1795. #pragma segment ARes
  1796. pascal void TTaroStaticText::SetText(const Str255 & aString, Boolean redraw)    
  1797. {
  1798.     if(fDrawingEnvironment && redraw)
  1799.         ((TColorDrawingEnvironment *)fDrawingEnvironment)->Setup();
  1800.     inherited::SetText(aString, redraw);
  1801. }
  1802.  
  1803. // ============================== TInfoView =================================
  1804. #pragma segment AOpen
  1805. pascal void TInfoView::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1806. {
  1807.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  1808.     fIdleFreq = 0;                                    // so DoSetCursor gets called often    
  1809. }
  1810.  
  1811. // ------------------------------------------------------------------------
  1812. #pragma segment AOpen
  1813. pascal void TInfoView::SetView(TNumberStringView * aBlackNumber, TNumberStringView * aWhiteNumber,
  1814.         TTaroStaticText * aStaticText, TStringView * aBlackText, TStringView * aWhiteText)
  1815. {
  1816.     fBlackNumber = aBlackNumber;
  1817.     fWhiteNumber = aWhiteNumber;
  1818.     fStaticText = aStaticText;
  1819.     fBlackText = aBlackText;
  1820.     fWhiteText = aWhiteText;
  1821. }
  1822.  
  1823. // ------------------------------------------------------------------------
  1824. #pragma segment ARes
  1825. pascal void TInfoView::SetNumber(CellState aColor, short aNumber)    
  1826. {
  1827.     if(aColor == kBlack)
  1828.         fBlackNumber->SetValue((long)aNumber, TRUE);
  1829.     else if(aColor == kWhite)
  1830.         fWhiteNumber->SetValue((long)aNumber, TRUE);
  1831. }
  1832.  
  1833. // ------------------------------------------------------------------------
  1834. #pragma segment ARes
  1835. pascal void TInfoView::SetPlayer(CellState aColor, Str255 aPlayerStr)    
  1836. {
  1837.     if(aColor == kBlack)
  1838.         fBlackText->SetText(aPlayerStr, FALSE);
  1839.     else if(aColor == kWhite)
  1840.         fWhiteText->SetText(aPlayerStr, FALSE);
  1841. }
  1842.  
  1843. // ------------------------------------------------------------------------
  1844. #pragma segment ASelCommand
  1845. pascal void TInfoView::ShowStatusMessage(Str255 & aMessage)
  1846. {
  1847.     fStaticText->SetText(aMessage, TRUE);
  1848. }
  1849.  
  1850.  
  1851. // ============================== TStringView =================================
  1852. #pragma segment AOpen
  1853. pascal void TStringView::IRes(TDocument* itsDocument, TView* itsSuperView, TStream* itsParams)
  1854. {
  1855.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  1856.     AddAdorner(gTaroApplication->GetTaroEraser(), kDrawView - 10, FALSE);
  1857.     fString = "";
  1858. }
  1859.  
  1860. // ------------------------------------------------------------------------
  1861. #pragma segment AOpen
  1862. pascal void TStringView::Draw(const VRect& /*area*/)
  1863. {
  1864.     Str255    aString = fString;
  1865.     Rect        anQDExtent;
  1866.     Point        aPoint;
  1867.     FontInfo    aFontInfo;
  1868.     
  1869.     Focus();
  1870.     if(fDrawingEnvironment)
  1871.         ((TColorDrawingEnvironment *)fDrawingEnvironment)->Setup();
  1872.     GetQDExtent(anQDExtent);
  1873.     EraseRect(anQDExtent);
  1874.     short    width = (anQDExtent.Size()).h;
  1875.     if(StringWidth(aString) > width)
  1876.     {
  1877.         OSErr    anError = TruncString(width, aString, smTruncEnd);
  1878.         if((anError != smNotTruncated) && (anError != smTruncated) && (anError != smTruncErr))
  1879.             FailOSErr(anError);
  1880.     }
  1881.     GetFontInfo(aFontInfo);
  1882.     MoveTo(anQDExtent.left + (width - StringWidth(aString)) / 2, anQDExtent.top + aFontInfo.ascent);
  1883.     DrawString(aString);
  1884. }
  1885.  
  1886. // ------------------------------------------------------------------------
  1887. #pragma segment ARes
  1888. pascal void TStringView::SetColor(CellState aColor)    
  1889. {
  1890.     fDrawingEnvironment = gTaroApplication->GetDrawingEnvironment(aColor);
  1891. }
  1892.  
  1893. // ------------------------------------------------------------------------
  1894. #pragma segment ARes
  1895. pascal void TStringView::SetText(Str255 & aString, Boolean redraw)    
  1896. {
  1897.     fString = aString;
  1898.     if(redraw)
  1899.     {
  1900.         Rect    aQDExtent;
  1901.         
  1902.         GetQDExtent(aQDExtent);
  1903.         Draw(aQDExtent);
  1904.     }
  1905. }
  1906.  
  1907. // ============================== TNumberStringView =================================
  1908. #pragma segment ARes
  1909. pascal void TNumberStringView::SetValue(long value, Boolean redraw)    
  1910. {
  1911.     Str255    aNumberString;
  1912.     
  1913.     NumToString(value, aNumberString);
  1914.     SetText(aNumberString, redraw);
  1915. }
  1916.  
  1917. // ============================== TVisibleCell =================================
  1918. #pragma segment ADoCommand
  1919. pascal void TVisibleCell::ChangeState(void)    
  1920. {
  1921.     inherited::ChangeState();
  1922.     (((TVisibleScene *)GetScene())->ReturnTaroGridView())->ForceRedrawCell(this);
  1923. }
  1924.  
  1925. // ------------------------------------------------------------------------
  1926. #pragma segment AOpen
  1927. pascal void TVisibleCell::PutPiece(void)
  1928. {
  1929.     inherited::PutPiece();
  1930.     (((TVisibleScene *)GetScene())->ReturnTaroGridView())->SetEraseColor(this);
  1931. }
  1932.  
  1933.  
  1934. // ============================== TMousePlayer =================================
  1935. #pragma segment AOpen
  1936. pascal void TMousePlayer::IMousePlayer(TCoreDocument * aCoreDocument)    
  1937. {
  1938.     IPlayer(aCoreDocument);
  1939.     SetStatus(kReady);
  1940. }
  1941.  
  1942. // ------------------------------------------------------------------------
  1943. #pragma segment ASelCommand
  1944. pascal void TMousePlayer::MyTurn(void)    
  1945. {
  1946.     Str255    StatusMessage;
  1947.         
  1948.     GetIndString(StatusMessage, kStatusMessage, kMousePlayer);
  1949.     ((TVisibleDocument *)GetCoreDocument())->ShowStatusMessage(StatusMessage);
  1950.     inherited::MyTurn();
  1951.     if((((TVisibleDocument *)GetCoreDocument())->ReturnVisibleScene())->HasAvailableCell() == 0)
  1952.     {
  1953.         TMoveCommand * aMoveCommand = new TMoveCommand;
  1954.         FailNIL(aMoveCommand);
  1955.         aMoveCommand->IMoveCommand(this, NULL);
  1956.         gTaroApplication->PostCommand(aMoveCommand);
  1957.     }
  1958. }
  1959.  
  1960. // ------------------------------------------------------------------------
  1961. #pragma segment ASelCommand
  1962. pascal void TMousePlayer::MouseMove(TRecordCell * aMouseMove)
  1963. {
  1964.     TMoveCommand * aMoveCommand = new TMoveCommand;
  1965.     FailNIL(aMoveCommand);
  1966.     aMoveCommand->IMoveCommand(this, aMouseMove);
  1967.     gTaroApplication->PostCommand(aMoveCommand);
  1968. }
  1969.  
  1970. // ------------------------------------------------------------------------
  1971. #pragma segment ASelCommand
  1972. pascal void TMousePlayer::GetName(Str255 & aString)
  1973. {
  1974.     GetIndString(aString, kPlayerString, kMousePlayer);
  1975. }
  1976.  
  1977. // ------------------------------------------------------------------------
  1978. #pragma segment AClose
  1979. pascal void TMousePlayer::GameOver(GameResult aResult)    
  1980. {
  1981.     if(aResult == kWin)
  1982.     {
  1983.         Str255    GameOverMessage;
  1984.         
  1985.         GetIndString(GameOverMessage, kGameOverMessage, kMousePlayer);
  1986.         ((TVisibleDocument *)GetCoreDocument())->ShowStatusMessage(GameOverMessage);
  1987.     }
  1988. }
  1989.  
  1990.  
  1991. // ============================== TVisibleAEPlayer =================================
  1992. #pragma segment AClose
  1993. pascal void TVisibleAEPlayer::GameOver(GameResult aResult)    
  1994. {
  1995.     if(aResult == kWin)
  1996.         ShowPlayerMessage(kGameOverMessage);
  1997.     inherited::GameOver(aResult);
  1998. }
  1999.  
  2000. // ------------------------------------------------------------------------
  2001. #pragma segment ASelCommand
  2002. pascal void TVisibleAEPlayer::ShowPlayerMessage(short statusID)    
  2003. {
  2004.     Str255    GameOverMessage, PlayerName;
  2005.     Handle    baseText = NewHandle(1);
  2006.     Handle    substitutionText = NewHandle(1);
  2007.     Str15        KeyString;
  2008.     Str255    KeyStr255 = (char *)(**GetString(kSubstitutionKey));
  2009.     
  2010.     unsigned char    length = KeyStr255.Length();
  2011.     if(length > 15)
  2012.         length = 15;
  2013.     strncpy((char *)&KeyString[1], (char *)KeyStr255, length);
  2014.     KeyString[0] = length;
  2015.         
  2016.     GetIndString(GameOverMessage, statusID, kRemoteAEPlayer);
  2017.     SetIText(baseText, GameOverMessage);
  2018.     GetName(PlayerName);
  2019.     SetIText(substitutionText, PlayerName);
  2020.     ReplaceText(baseText, substitutionText, KeyString);
  2021.     GetIText(baseText, GameOverMessage);
  2022.     DisposHandle(baseText);
  2023.     DisposHandle(substitutionText);
  2024.     ((TVisibleDocument *)GetCoreDocument())->ShowStatusMessage(GameOverMessage);
  2025. }
  2026.  
  2027. // ------------------------------------------------------------------------
  2028. #pragma segment ASelCommand
  2029. pascal void TVisibleAEPlayer::MyTurn(void)    
  2030. {
  2031.     if(!GetPermission())
  2032.     {
  2033.         ShowPlayerMessage(kStatusMessage);
  2034.         inherited::MyTurn();
  2035.     }
  2036. }
  2037.  
  2038. // ------------------------------------------------------------------------
  2039. #pragma segment AOpen
  2040. pascal void TVisibleAEPlayer::GetName(Str255 & aString)
  2041. {
  2042.     ((TClientTarget *)ReturnTarget())->GetName(aString);
  2043. }
  2044.  
  2045.  
  2046. // ------------------------------------------------------------------------
  2047. #pragma segment ADoCommand
  2048. pascal void TVisibleAEPlayer::MyMove(TRecordCell * aMove)
  2049. {
  2050.     gTaroApplication->PlaySound(kDive);
  2051.     inherited::MyMove(aMove);
  2052. }
  2053.  
  2054.  
  2055. // ============================== TServerAEPlayer =================================
  2056. #pragma segment AOpen
  2057. pascal void TServerAEPlayer::IServerAEPlayer(TCoreDocument * aCoreDocument, CellState aColor)    
  2058. {
  2059.     SetCoreDocument(aCoreDocument);
  2060.     SetMyColor(aColor);
  2061.     SetStatus(kReady);
  2062. }
  2063.  
  2064. // ------------------------------------------------------------------------
  2065. #pragma segment AClose
  2066. pascal void TServerAEPlayer::Free(void)
  2067. {
  2068.     ReturnTarget()->Free();
  2069.     inherited::Free();
  2070. }
  2071.  
  2072.  
  2073. // ============================== TClientAEPlayer =================================
  2074. #pragma segment AOpen
  2075. pascal void TClientAEPlayer::IClientAEPlayer(TCoreDocument * aCoreDocument,
  2076.                                         CellState    aColor, TClientTarget * aClientTarget)    
  2077. {
  2078.     aClientTarget->SendBeginTransaction((long)this);
  2079.     IAppleEventPlayer(aCoreDocument, aColor);
  2080.     SetTarget(aClientTarget);
  2081. }
  2082.  
  2083. // ------------------------------------------------------------------------
  2084. #pragma segment AOpen
  2085. pascal void TClientAEPlayer::TargetReply(unsigned long aTargetTransactionID)    
  2086. {
  2087.     SetTargetTransactionID(aTargetTransactionID);
  2088.     if(aTargetTransactionID != 0)
  2089.     {
  2090.         char HCellSize, VCellSize;
  2091.         ((TClientTarget *)ReturnTarget())->AddUser(this);
  2092.     
  2093.         GetCoreDocument()->GetCellSize(HCellSize, VCellSize);
  2094.         ((TClientTarget *)ReturnTarget())->SendNewElement(HCellSize, VCellSize, GetMyColor(), this, aTargetTransactionID);
  2095.     }
  2096.     else
  2097.         SetStatus(kFailed);
  2098. }
  2099.  
  2100. // ------------------------------------------------------------------------
  2101. #pragma segment ASelCommand
  2102. pascal void TClientAEPlayer::SetTargetTableSpecifier(AEDesc & aTargetSpec)    
  2103. {
  2104.     if(aTargetSpec.descriptorType != typeNull)
  2105.     {
  2106.         inherited::SetTargetTableSpecifier(aTargetSpec);
  2107.         SetStatus(kReady);
  2108.     }
  2109.     else
  2110.         SetStatus(kFailed);
  2111. }
  2112.  
  2113. // ------------------------------------------------------------------------
  2114. #pragma segment AClose
  2115. pascal void TClientAEPlayer::TargetDied(void)    
  2116. {
  2117.     ((TVisibleDocument *)GetCoreDocument())->GameClose();
  2118. }
  2119.  
  2120.  
  2121. // ============================== TClientTarget =================================
  2122. #pragma segment AOpen
  2123. pascal void TClientTarget::IClientTarget(void)    
  2124. {
  2125.     TList * aList = NewList();
  2126.     FailNIL(aList);
  2127.     fUserList = aList;
  2128.     fUserList->SetEltType("TClientAEPlayer");
  2129. }
  2130.  
  2131. // ------------------------------------------------------------------------
  2132. #pragma segment ARes
  2133. pascal void TClientTarget::Remove(void)    
  2134. {
  2135. }
  2136.  
  2137. // ------------------------------------------------------------------------
  2138. #pragma segment AClose
  2139. pascal void TClientTarget::Free(void)    
  2140. {
  2141.     fUserList->DeleteAll();
  2142.     fUserList->Free();
  2143.     inherited::Free();
  2144. }
  2145.  
  2146. // ------------------------------------------------------------------------
  2147. #pragma segment AOpen
  2148. pascal void TClientTarget::AddUser(TClientAEPlayer * theClient)    
  2149. {
  2150.     fUserList->InsertLast(theClient);
  2151. }
  2152.  
  2153. // ------------------------------------------------------------------------
  2154. #pragma segment ASelCommand
  2155. pascal void TClientTarget::SendNewElement(char HCellSize, char VCellSize, CellState aColor,
  2156.                                                         TVisibleAEPlayer * theClient, unsigned long aTransactionID)    
  2157. {
  2158.     TAppleEvent    * theAppleEvent;
  2159.     DescType        ElementType = cTable;
  2160.     AEDesc    dNull;
  2161.     AERecord    ElementList;
  2162.     short    hSize = HCellSize;
  2163.     short    vSize = VCellSize;
  2164.     long    color = aColor;
  2165.     
  2166.     theAppleEvent = CreateAppleEvent(kAECoreSuite, kAENewElement,
  2167.                     kNewElementReturnID, aTransactionID);
  2168.     theAppleEvent->WriteParameterPtr(keyAEObjectClass, typeType,
  2169.                     (Ptr)&ElementType, sizeof(ElementType));
  2170.     FailOSErr(AECreateDesc(typeNull, NULL, 0, dNull));
  2171.     theAppleEvent->WriteParameter(keyAEInsertHere, dNull);
  2172.     FailOSErr(AECreateList(NULL, 0, TRUE, ElementList));
  2173.     FailOSErr(AEPutKeyPtr(ElementList, keyTaroColumnNumber, typeShortInteger, (Ptr)&hSize, sizeof(hSize)));
  2174.     FailOSErr(AEPutKeyPtr(ElementList, keyTaroRowNumber, typeShortInteger, (Ptr)&vSize, sizeof(vSize)));
  2175.     FailOSErr(AEPutKeyPtr(ElementList, keyTaroColor, typeEnumerated, (Ptr)&color, sizeof(color)));
  2176.     StringHandle    UserName = GetString(-16096);
  2177.     if(UserName == NULL)
  2178.         FailNILResource((Handle)(UserName = GetString(-16413)));
  2179.     LockHandleHigh((Handle)UserName);
  2180.     FailOSErr(AEPutKeyPtr(ElementList, keyTaroUserName, typeChar, (char *)(**UserName), (**UserName).Length()));
  2181.     HUnlock((Handle)UserName);
  2182.     
  2183.     AEDesc    tableSpec;
  2184.     (theClient->GetCoreDocument())->CreateTableSpecifier(tableSpec);
  2185.     FailOSErr(AEPutKeyDesc(ElementList, keyTaroTableSpecifier, tableSpec));
  2186.     theAppleEvent->WriteParameter(keyAEData, ElementList);
  2187.     theAppleEvent->SetSendingMode(kAEQueueReply + kAECanInteract + kAECanSwitchLayer);
  2188.     theAppleEvent->Send();
  2189.     theAppleEvent->Free();
  2190.     FailOSErr(AEDisposeDesc(dNull));
  2191.     FailOSErr(AEDisposeDesc(tableSpec));
  2192.     FailOSErr(AEDisposeDesc(ElementList));
  2193. }
  2194.  
  2195. // ------------------------------------------------------------------------
  2196. #pragma segment ASelCommand
  2197. pascal void TClientTarget::SendBeginTransaction(long & aTransactionID)    
  2198. {
  2199.     TAppleEvent    * theAppleEvent;
  2200.     
  2201.     theAppleEvent = CreateAppleEvent(kAECoreSuite, kAEBeginTransaction,
  2202.                     kBeginTransactionReturnID, aTransactionID);
  2203.     theAppleEvent->SetSendingMode(kAEQueueReply);
  2204.     theAppleEvent->Send();
  2205.     theAppleEvent->Free();
  2206. }
  2207.  
  2208. // ------------------------------------------------------------------------
  2209. #pragma segment AClose
  2210. pascal void TClientTarget::SendEndTransaction(GameResult aResult, unsigned long theServer, TPlayer * theClient)    
  2211. {
  2212.     inherited::SendEndTransaction(aResult, theServer, theClient);
  2213.     fUserList->Delete(theClient);
  2214. }
  2215.  
  2216. // ------------------------------------------------------------------------
  2217. #pragma segment ASelCommand
  2218. pascal void TClientTarget::GetName(Str255 &/*aString*/)    
  2219. {
  2220. }
  2221.  
  2222. // ------------------------------------------------------------------------
  2223. #pragma segment ASelCommand
  2224. pascal void TClientTarget::SendQuitApplication(void)    
  2225. {
  2226.     TAppleEvent    * theAppleEvent;
  2227.     
  2228.     theAppleEvent = CreateAppleEvent(kCoreEventClass, kAEQuitApplication,
  2229.                         kAutoGenerateReturnID, kAnyTransactionID);
  2230.     theAppleEvent->SetSendingMode(kAENoReply);
  2231.     theAppleEvent->Send();
  2232.     theAppleEvent->Free();
  2233. }
  2234.  
  2235. // ------------------------------------------------------------------------
  2236. #pragma segment ASelCommand
  2237. pascal short TClientTarget::GetUserCount(void)    
  2238. {
  2239.     return    (short)fUserList->GetSize();
  2240. }
  2241.  
  2242. // ------------------------------------------------------------------------
  2243. #pragma segment AClose
  2244. pascal void TClientTarget::TellUsersThatProcessDied(void)
  2245. {
  2246.     CObjectIterator iter(fUserList);
  2247.         
  2248.     for (TClientAEPlayer * user = (TClientAEPlayer *)iter.FirstObject(); iter.More(); user = (TClientAEPlayer *)iter.NextObject())
  2249.         user->TargetDied();
  2250. }
  2251.  
  2252.  
  2253. // ============================== TPPCTarget =================================
  2254. #pragma segment AOpen
  2255. pascal void TPPCTarget::IPPCTarget(TargetIDHdl aTargetID)    
  2256. {
  2257.     fTargetID = aTargetID;
  2258.     HLock((Handle)fTargetID);
  2259.     CreateDesc(typeTargetID, (Ptr)(*fTargetID), sizeof(**fTargetID));
  2260.     HUnlock((Handle)fTargetID);
  2261.     IClientTarget();
  2262. }
  2263.  
  2264. // ------------------------------------------------------------------------
  2265. #pragma segment ASelCommand
  2266. pascal void TPPCTarget::GetName(Str255 & aString)    
  2267. {
  2268.     Str32        targetName;
  2269.     HLock((Handle)fTargetID);
  2270.     switch((*fTargetID)->location.locationKindSelector)
  2271.     {
  2272.     default:
  2273.     case    ppcNoLocation:
  2274.         targetName = (*fTargetID)->name.name;
  2275.         break;
  2276.     case    ppcNBPLocation:
  2277.         targetName = (*fTargetID)->location.u.nbpEntity.objStr;
  2278.         break;
  2279.     case    ppcNBPTypeLocation:
  2280.         targetName = (*fTargetID)->location.u.nbpType;
  2281.         break;
  2282.     }
  2283.     HUnlock((Handle)fTargetID);
  2284.     memcpy((void *)&aString, (void *)&targetName, targetName.Length() + 1);
  2285. }
  2286.  
  2287. // ------------------------------------------------------------------------
  2288. #pragma segment ARes
  2289. pascal void TPPCTarget::Remove(void)    
  2290. {
  2291.     RmveResource((Handle)fTargetID);
  2292.     FailResError();
  2293. }
  2294.  
  2295. // ------------------------------------------------------------------------
  2296. #pragma segment ASelCommand
  2297. pascal void TPPCTarget::Free(void)    
  2298. {
  2299.     DisposHandle((Handle)fTargetID);
  2300.     inherited::Free();
  2301. }
  2302.  
  2303. // ============================== TPSNTarget =================================
  2304. #pragma segment AOpen
  2305. pascal void TPSNTarget::IPSNTarget(AliasHandle aFile)    
  2306. {
  2307.     fFile = aFile;
  2308.     fProcess.highLongOfPSN = 0;
  2309.     fProcess.lowLongOfPSN = 0;
  2310.     CreateDesc(typeNull, NULL, (Size)0);
  2311.     IClientTarget();
  2312. }
  2313.  
  2314. // ------------------------------------------------------------------------
  2315. #pragma segment AOpen
  2316. pascal Boolean TPSNTarget::TestProcess(void)    
  2317. {
  2318.     if((fProcess.highLongOfPSN == 0) && (fProcess.lowLongOfPSN == 0))
  2319.         return FALSE;
  2320.     else
  2321.         return TRUE;
  2322. }
  2323.  
  2324. // ------------------------------------------------------------------------
  2325. #pragma segment AOpen
  2326. pascal void TPSNTarget::LaunchProcess(void)    
  2327. {
  2328.     if(!TestProcess())
  2329.     {
  2330.         LaunchParamBlockRec     MyLPBRec;
  2331.         FSSpec    TargetFSSpec;
  2332.     
  2333.         MyLPBRec.launchBlockID = extendedBlock;
  2334.         MyLPBRec.launchEPBLength = extendedBlockLen;
  2335.         MyLPBRec.launchControlFlags = launchContinue + launchNoFileFlags + launchDontSwitch;
  2336.         MyLPBRec.launchAppParameters = NULL;
  2337.         GetFSSpec(TargetFSSpec);
  2338.         MyLPBRec.launchAppSpec = &TargetFSSpec;
  2339.         FailOSErr(LaunchApplication(MyLPBRec));
  2340.         CreateDesc(typeProcessSerialNumber, (Ptr)&MyLPBRec.launchProcessSN, sizeof(MyLPBRec.launchProcessSN));
  2341.         fProcess = MyLPBRec.launchProcessSN;
  2342.     }
  2343. }
  2344.  
  2345. // ------------------------------------------------------------------------
  2346. #pragma segment ASelCommand
  2347. pascal void TPSNTarget::GetFSSpec(FSSpec & aFile)    
  2348. {
  2349.     Boolean    wasChanged;
  2350.     
  2351.     FailOSErr(ResolveAlias(NULL, fFile, aFile, wasChanged));
  2352.     if(wasChanged)
  2353.     {
  2354.         ChangedResource((Handle)fFile);
  2355.         FailResError();
  2356.     }
  2357. }
  2358.  
  2359. // ------------------------------------------------------------------------
  2360. #pragma segment ASelCommand
  2361. pascal void TPSNTarget::SendBeginTransaction(long & aTransactionID)    
  2362. {
  2363.     LaunchProcess();
  2364.     inherited::SendBeginTransaction(aTransactionID);
  2365. }
  2366.  
  2367. // ------------------------------------------------------------------------
  2368. #pragma segment AClose
  2369. pascal void TPSNTarget::SendEndTransaction(GameResult aResult, unsigned long theServer, TPlayer * theClient)    
  2370. {
  2371.     if(TestProcess())
  2372.         inherited::SendEndTransaction(aResult, theServer, theClient);
  2373. }
  2374.  
  2375. // ------------------------------------------------------------------------
  2376. #pragma segment ASelCommand
  2377. pascal void TPSNTarget::GetName(Str255 & aString)    
  2378. {
  2379.     FSSpec    aFile;
  2380.     
  2381.     GetFSSpec(aFile);
  2382.     aString = aFile.name;
  2383. }
  2384.  
  2385. // ------------------------------------------------------------------------
  2386. #pragma segment ARes
  2387. pascal void TPSNTarget::Remove(void)    
  2388. {
  2389.     RmveResource((Handle)fFile);
  2390.     FailResError();
  2391. }
  2392.  
  2393. // ------------------------------------------------------------------------
  2394. #pragma segment ASelCommand
  2395. pascal void TPSNTarget::Free(void)    
  2396. {
  2397.     if(TestProcess())
  2398.         SendQuitApplication();
  2399.     DisposHandle((Handle)fFile);
  2400.     inherited::Free();
  2401. }
  2402.  
  2403. // ------------------------------------------------------------------------
  2404. #pragma segment ASelCommand
  2405. pascal void TPSNTarget::CompareProcess(ProcessSerialNumber & theProcess)    
  2406. {
  2407.     Boolean    Result;
  2408.     
  2409.     Lock(TRUE);
  2410.     OSErr    Error = SameProcess(theProcess, fProcess, Result);
  2411.     Lock(FALSE);
  2412.     FailOSErr(Error);
  2413.     if(Result)
  2414.     {
  2415.         fProcess.highLongOfPSN = 0;
  2416.         fProcess.lowLongOfPSN = 0;
  2417.         TellUsersThatProcessDied();
  2418.     };
  2419. }
  2420.  
  2421.  
  2422. // ============================== TColorDrawingEnvironment =================================
  2423. #pragma segment AOpen
  2424. pascal void TColorDrawingEnvironment::Initialize(void)    
  2425. {
  2426.     inherited::Initialize();
  2427.     fColorTableHandle = NULL;
  2428.     for(DrawPart aPart = kForeground; aPart < kDrawPartEnd; aPart++)
  2429.         fPixPatTable[aPart] = NULL;
  2430. }
  2431.  
  2432. // ------------------------------------------------------------------------
  2433. #pragma segment AOpen
  2434. pascal void TColorDrawingEnvironment::Free(void)    
  2435. {
  2436.     DisposHandle((Handle)fColorTableHandle);
  2437.     for(DrawPart aPart = kForeground; aPart < kDrawPartEnd; aPart++)
  2438.         DisposPixPat(fPixPatTable[aPart]);
  2439.     inherited::Free();
  2440. }
  2441.  
  2442. // ------------------------------------------------------------------------
  2443. #pragma segment AOpen
  2444. pascal void TColorDrawingEnvironment::IColorDrawingEnvironment(short aColorTableID)    
  2445. {
  2446.     IDrawingEnvironment();
  2447.     fID = aColorTableID;
  2448.     
  2449.     if(gConfiguration.hasColorQD)
  2450.     {
  2451.         FailNILResource((Handle)(fColorTableHandle = GetCTable(aColorTableID)));
  2452.         fBackgroundColor = ((*fColorTableHandle)->ctTable[1]).rgb;
  2453.         for(DrawPart aPart = kForeground; aPart < kDrawPartEnd; aPart++)
  2454.             fPixPatTable[aPart] = NewPixPat();
  2455.         MakePixPatTable();
  2456.     }
  2457. }
  2458.  
  2459. // ------------------------------------------------------------------------
  2460. #pragma segment ARes
  2461. pascal void TColorDrawingEnvironment::SetupAdornerColor(DrawPart aPart)    
  2462. {
  2463.     Setup();
  2464.     if(gColorAvailable)
  2465.         PenPixPat(fPixPatTable[aPart]);
  2466.     else
  2467.     {
  2468.         Pattern    fore;
  2469.         GetIndPattern(fore, fID, aPart + 1);
  2470.         PenPat(fore);
  2471.     }
  2472. }
  2473.  
  2474. // ------------------------------------------------------------------------
  2475. #pragma segment ARes
  2476. pascal void TColorDrawingEnvironment::Setup(void)    
  2477. {
  2478.     if(!gColorAvailable)
  2479.     {
  2480.         Pattern    fore, back;
  2481.         fForegroundColor = gRGBBlack;
  2482.         fBackgroundColor = gRGBWhite;
  2483.         GetIndPattern(fore, fID, kForeground + 1);
  2484.         memcpy(fPenPattern, fore, 8);
  2485.         inherited::Setup();
  2486.         GetIndPattern(back, fID, kBackground + 1);
  2487.         BackPat(back);
  2488.     }
  2489.     else
  2490.     {
  2491.         inherited::Setup();
  2492.         PenPixPat(fPixPatTable[kForeground]);
  2493.         BackPixPat(fPixPatTable[kBackground]);
  2494.     }
  2495.     if(fID == kBlackCTable)
  2496.         TextMode(srcBic);
  2497.     else
  2498.         TextMode(srcOr);
  2499.     TextFont(0);
  2500. }
  2501.  
  2502. // ------------------------------------------------------------------------
  2503. #pragma segment ARes
  2504. pascal void TColorDrawingEnvironment::MakePixPatTable(void)    
  2505. {
  2506.     for(DrawPart aPart = kForeground; aPart < kDrawPartEnd; aPart++)
  2507.         MakeRGBPat(fPixPatTable[aPart], ((*fColorTableHandle)->ctTable[aPart]).rgb);
  2508. }
  2509.  
  2510. // ============================== TTaroEraser =================================
  2511. #pragma segment ARes
  2512. pascal void TTaroEraser::Draw(TView * itsView, const VRect& area)    
  2513. {
  2514.     TDrawingEnvironment * aDrawingEnvironment = itsView->GetDrawingEnvironment();
  2515.     if(aDrawingEnvironment)
  2516.         aDrawingEnvironment->Setup();
  2517.     inherited::Draw(itsView, area);
  2518. }
  2519.  
  2520. // ============================== TSoundCommand =================================
  2521. #pragma segment AOpen
  2522. pascal void TSoundCommand::ISoundCommand(SoundEffect aSound)    
  2523. {
  2524.     inherited::ICommand(0, NULL, FALSE, FALSE, NULL);
  2525.     fSound = aSound;
  2526. }
  2527.  
  2528. // ------------------------------------------------------------------------
  2529. #pragma segment ADoCommand
  2530. pascal void TSoundCommand::DoIt(void)    
  2531. {
  2532.     gTaroApplication->PlaySound(fSound);
  2533.     fCommandDone = TRUE;
  2534. }
  2535.  
  2536.